-
1. Re: Messaging Persistence and Multiple JBoss Instances
timfox Apr 11, 2007 9:24 AM (in response to rtm333)This should be no "interference" between instances - each instance maintains its own unique queue - have you ensured each server has been given a unique server id?
-
2. Re: Messaging Persistence and Multiple JBoss Instances
rtm333 Apr 13, 2007 4:35 AM (in response to rtm333)Tim,
Thanks for your reply.
Actually, we do not give any unique ids to the server instances. Where and how could this be done?
To clarify, I'm not talking about some form of clustering. We are using several independent "instances" of JBoss, that are mapped to different ports by the ServiceBindingManager. The instances share a common Sybase database for persisting JMS messages.
In the meantime we have explored this issue in two directions:
1. Using an instance specific sybase-persistence-service.xml, that adds a server id column to all JMS persistence tables and uses a (hard-coded) server id in all SQL statements for selections/updates.
2. Usage of Apache Derby: This creates an individual copy of the persistence database in each instance's data directory. There are two problems with this approach:
a) JDBC type LONGVARBINARY (used for storing message content) is not compatible to Derby type BLOB, but only to "LONG VARCHAR FOR BIT DATA" with a maximum length of 32700 bytes.
b) In method org.jboss.messaging.core.plugin.JDBCPersistenceManager.getBytes(ResultSet rs, int columnIndex) the method rs.getBinaryStream() is invoked twice on the same column (line 4250). This is considered an error by Derby. Workaround: change the second usage to use the first result (i), recompile and use the generated jboss-messaging.jar in jboss-messaging.sar.
// is = new BufferedInputStream(rs.getBinaryStream(columnIndex), BUFFER_SIZE);
is = new BufferedInputStream(i, BUFFER_SIZE);
Both solutions seem to work (in Derby's case with the limitation that messages longer than about 32k cannot be stored). -
3. Re: Messaging Persistence and Multiple JBoss Instances
timfox Apr 13, 2007 7:49 AM (in response to rtm333)"rtm333" wrote:
Tim,
Thanks for your reply.
Actually, we do not give any unique ids to the server instances. Where and how could this be done?
This is done in messaging-service.xml:<constructor> <!-- ServerPeerID --> <arg type="int" value="0"/> <!-- DefaultQueueJNDIContext --> <arg type="java.lang.String" value="/queue"/> <!-- DefaultTopicJNDIContext --> <arg type="java.lang.String" value="/topic"/> </constructor>
The ServerPeerID needs to be unique for every node.
To clarify, I'm not talking about some form of clustering. We are using several independent "instances" of JBoss, that are mapped to different ports by the ServiceBindingManager. The instances share a common Sybase database for persisting JMS messages.
In this case each instance needs to use its own set of tables.
You're best bet is to use a different schema for each server (you can do this in Oracle not sure about Sybase)
In the meantime we have explored this issue in two directions:
1. Using an instance specific sybase-persistence-service.xml, that adds a server id column to all JMS persistence tables and uses a (hard-coded) server id in all SQL statements for selections/updates.
Sounds prone to error, why not just set up different schemas?
2. Usage of Apache Derby: This creates an individual copy of the persistence database in each instance's data directory. There are two problems with this approach:
a) JDBC type LONGVARBINARY (used for storing message content) is not compatible to Derby type BLOB, but only to "LONG VARCHAR FOR BIT DATA" with a maximum length of 32700 bytes.
b) In method org.jboss.messaging.core.plugin.JDBCPersistenceManager.getBytes(ResultSet rs, int columnIndex) the method rs.getBinaryStream() is invoked twice on the same column (line 4250). This is considered an error by Derby. Workaround: change the second usage to use the first result (i), recompile and use the generated jboss-messaging.jar in jboss-messaging.sar.
Thanks.
Currentlty we don't officially support Derby but if there is sufficient demand we will make all the necessary changes and put it through the QA process to get it to work.
If you like, you could add a feature request for this in JIRA?