JBoss Messaging Configuration

1.     Introduction

JBoss Messaging is a high performance JMS provider in the JBoss Enterprise Middleware Stack (JEMS). JBoss Messaging is the default JMS provider in JBoss AS 5.x and later.

2.     Features 

  • A fully compatible and Sun certified JMS 1.1 implementation.
  • A strong focus on performance, reliability and scalability with high output and low latency.
  • Publish-subscribe and point-to-point messaging models.
  • Topics that feed multiple message queues
  • Persistent and non-persistent messages
  • Guaranteed message delivery that ensures that messages arrive once and only once
  • Transactional and reliable – supporting ACID semantics
  • Customizable security framework based on JAAS

3.     JBoss-JMS Configuration

3.1.Configuration-Queue

  • Create queue-destination-service.xml file in \deploy\messaging folder for jboss 5.x
  • Here is sample xml file

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <server>
  3. <mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.messaging.destination:service=Queue,name=testQueue" xmbean-dd="xmdesc/Queue-xmbean.xml">
  4. <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
  5. <depends>jboss.messaging:service=PostOffice</depends>
  6. <attribute name="SecurityConfig">
  7. <security>
  8. <role name="guest" read="true" write="true"/>
  9. <role name="publisher" read="true" write="true" create="false"/>
  10. <role name="noacc" read="false" write="false" create="false"/>
  11. </security>
  12. </attribute>
  13. </mbean>
  14. </server>
  • Restart Jboss server

3.2.Configuration-Topic

  • Create topic-destination-service.xml file in \deploy\messaging folder for jboss 5.x
  • Here is sample xml file

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <server>
  3. <mbean code="org.jboss.jms.server.destination. TopicService" name="jboss.messaging.destination:service=Topic,name= testTopic" xmbean-dd="xmdesc/Queue-xmbean.xml">
  4. <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
  5. <depends>jboss.messaging:service=PostOffice</depends>
  6. <attribute name="SecurityConfig">
  7. <security>
  8. <role name="guest" read="true" write="true"/>
  9. <role name="publisher" read="true" write="true" create="false"/>
  10. <role name="noacc" read="false" write="false" create="false"/>
  11. </security>
  12. </attribute>
  13. </mbean>
  14. </server>
  • Restart Jboss server

4.     JBoss-Oracle configuration for JMS

Create these tables in Oracle database


  1. CREATE TABLE JBM_DUAL (DUMMY INTEGER, PRIMARY KEY (DUMMY))
  2. CREATE TABLE JBM_MSG_REF (MESSAGE_ID INTEGER, CHANNEL_ID INTEGER, TRANSACTION_ID INTEGER, STATE CHAR(1), ORD INTEGER, PAGE_ORD INTEGER, DELIVERY_COUNT INTEGER, SCHED_DELIVERY INTEGER, PRIMARY KEY(MESSAGE_ID, CHANNEL_ID))
  3. CREATE INDEX JBM_MSG_REF_TX ON JBM_MSG_REF (TRANSACTION_ID, STATE)
  4. CREATE TABLE JBM_MSG (MESSAGE_ID INTEGER, RELIABLE CHAR(1), EXPIRATION INTEGER, TIMESTAMP INTEGER, PRIORITY INTEGER, TYPE INTEGER, HEADERS BLOB, PAYLOAD BLOB, PRIMARY KEY (MESSAGE_ID))
  5. CREATE TABLE JBM_TX (NODE_ID INTEGER, TRANSACTION_ID INTEGER, BRANCH_QUAL RAW(254), FORMAT_ID INTEGER, GLOBAL_TXID RAW(254), PRIMARY KEY (TRANSACTION_ID))
  6. CREATE TABLE JBM_COUNTER (NAME VARCHAR2(255), NEXT_ID INTEGER, PRIMARY KEY(NAME))
  7. CREATE TABLE JBM_ID_CACHE (NODE_ID INTEGER, CNTR INTEGER, JBM_ID VARCHAR2(255), PRIMARY KEY(NODE_ID, CNTR))
  8. CREATE TABLE JBM_POSTOFFICE (POSTOFFICE_NAME VARCHAR2(255), NODE_ID INTEGER, QUEUE_NAME VARCHAR2(255), COND VARCHAR2(1023), SELECTOR VARCHAR2(1023), CHANNEL_ID INTEGER, CLUSTERED CHAR(1), ALL_NODES CHAR(1), PRIMARY KEY(POSTOFFICE_NAME, NODE_ID, QUEUE_NAME))
  9. CREATE TABLE JBM_USER (USER_ID VARCHAR2(32) NOT NULL, PASSWD VARCHAR2(32) NOT NULL, CLIENTID VARCHAR2(128), PRIMARY KEY(USER_ID))
  10. CREATE TABLE JBM_ROLE (ROLE_ID VARCHAR2(32) NOT NULL, USER_ID VARCHAR2(32) NOT NULL, PRIMARY KEY(USER_ID, ROLE_ID))

In order to enable support for one of these databases, just replace the default hsqldb-persistence-service.xml configuration file with the Oracle database-specific configuration file in \deploy\messaging folder.

Here is oracle specific persistence file.

oracle-persistence-service.xml


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. Oracle persistence deployment descriptor.
  4. Tested with Oracle 10.2.0.1
  5. $Id$
  6. -->
  7. <server>
  8. <!-- Persistence Manager MBean configuration======================================== -->
  9. <mbean code="org.jboss.messaging.core.jmx.JDBCPersistenceManagerService" name="jboss.messaging:service=PersistenceManager" xmbean-dd="xmdesc/JDBCPersistenceManager-xmbean.xml">
  10. <depends>jboss.jca:service=DataSourceBinding,name=DefaultDS</depends>
  11. <depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager</depends>
  12. <!-- The datasource to use for the persistence manager -->
  13. <attribute name="DataSource">java:/DefaultDS</attribute>
  14. <!-- If true will attempt to create tables and indexes on every start-up -->
  15. <attribute name="CreateTablesOnStartup">true</attribute>
  16. <!-- If true then we will automatically detect and reject duplicate messages sent during failover -->
  17. <attribute name="DetectDuplicates">true</attribute>
  18. <!-- The size of the id cache to use when detecting duplicate messages -->
  19. <attribute name="IDCacheSize">500</attribute>
  20. <!-- Some databases don't support inserting blobs using INSERT INTO ... SELECT FROM -->
  21. <attribute name="SupportsBlobOnSelect">false</attribute>
  22. <attribute name="SqlProperties"><![CDATA[
  23. CREATE_DUAL=CREATE TABLE JBM_DUAL (DUMMY INTEGER, PRIMARY KEY (DUMMY))
  24. CREATE_MESSAGE_REFERENCE=CREATE TABLE JBM_MSG_REF (MESSAGE_ID INTEGER, CHANNEL_ID INTEGER, TRANSACTION_ID INTEGER, STATE CHAR(1), ORD INTEGER, PAGE_ORD INTEGER, DELIVERY_COUNT INTEGER, SCHED_DELIVERY INTEGER, PRIMARY KEY(MESSAGE_ID, CHANNEL_ID))
  25. CREATE_IDX_MESSAGE_REF_TX=CREATE INDEX JBM_MSG_REF_TX ON JBM_MSG_REF (TRANSACTION_ID, STATE)
  26. CREATE_MESSAGE=CREATE TABLE JBM_MSG (MESSAGE_ID INTEGER, RELIABLE CHAR(1), EXPIRATION INTEGER, TIMESTAMP INTEGER, PRIORITY INTEGER, TYPE INTEGER, HEADERS BLOB, PAYLOAD BLOB, PRIMARY KEY (MESSAGE_ID))
  27. CREATE_TRANSACTION=CREATE TABLE JBM_TX (NODE_ID INTEGER, TRANSACTION_ID INTEGER, BRANCH_QUAL RAW(254), FORMAT_ID INTEGER, GLOBAL_TXID RAW(254), PRIMARY KEY (TRANSACTION_ID))
  28. CREATE_COUNTER=CREATE TABLE JBM_COUNTER (NAME VARCHAR2(255), NEXT_ID INTEGER, PRIMARY KEY(NAME))
  29. CREATE_ID_CACHE=CREATE TABLE JBM_ID_CACHE (NODE_ID INTEGER, CNTR INTEGER, JBM_ID VARCHAR2(255), PRIMARY KEY(NODE_ID, CNTR))
  30. INSERT_DUAL=INSERT INTO JBM_DUAL VALUES (1)
  31. CHECK_DUAL=SELECT 1 FROM JBM_DUAL
  32. INSERT_MESSAGE_REF=INSERT INTO JBM_MSG_REF (CHANNEL_ID, MESSAGE_ID, TRANSACTION_ID, STATE, ORD, PAGE_ORD, DELIVERY_COUNT, SCHED_DELIVERY) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
  33. DELETE_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE MESSAGE_ID=? AND CHANNEL_ID=? AND STATE='C'
  34. UPDATE_MESSAGE_REF=UPDATE JBM_MSG_REF SET TRANSACTION_ID=?, STATE='-' WHERE MESSAGE_ID=? AND CHANNEL_ID=? AND STATE='C'
  35. UPDATE_PAGE_ORDER=UPDATE JBM_MSG_REF SET PAGE_ORD = ? WHERE MESSAGE_ID=? AND CHANNEL_ID=?
  36. COMMIT_MESSAGE_REF1=UPDATE JBM_MSG_REF SET STATE='C', TRANSACTION_ID = NULL WHERE TRANSACTION_ID=? AND STATE='+'
  37. COMMIT_MESSAGE_REF2=DELETE FROM JBM_MSG_REF WHERE TRANSACTION_ID=? AND STATE='-'
  38. ROLLBACK_MESSAGE_REF1=DELETE FROM JBM_MSG_REF WHERE TRANSACTION_ID=? AND STATE='+'
  39. ROLLBACK_MESSAGE_REF2=UPDATE JBM_MSG_REF SET STATE='C', TRANSACTION_ID = NULL WHERE TRANSACTION_ID=? AND STATE='-'
  40. LOAD_PAGED_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, PAGE_ORD, SCHED_DELIVERY FROM JBM_MSG_REF WHERE CHANNEL_ID = ? AND PAGE_ORD BETWEEN ? AND ? ORDER BY PAGE_ORD
  41. LOAD_UNPAGED_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY, PAGE_ORD FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? ORDER BY ORD
  42. LOAD_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? ORDER BY ORD
  43. UPDATE_REFS_NOT_PAGED=UPDATE JBM_MSG_REF SET PAGE_ORD = NULL WHERE PAGE_ORD BETWEEN ? AND ? AND CHANNEL_ID=?
  44. SELECT_MIN_MAX_PAGE_ORD=SELECT MIN(PAGE_ORD), MAX(PAGE_ORD) FROM JBM_MSG_REF WHERE CHANNEL_ID = ?
  45. UPDATE_DELIVERY_COUNT=UPDATE JBM_MSG_REF SET DELIVERY_COUNT = ? WHERE MESSAGE_ID = ? AND CHANNEL_ID = ?/li>
  46. UPDATE_CHANNEL_ID=UPDATE JBM_MSG_REF SET CHANNEL_ID = ? WHERE CHANNEL_ID = ?
  47. MOVE_REFERENCE=UPDATE JBM_MSG_REF SET CHANNEL_ID = ? WHERE MESSAGE_ID = ? AND CHANNEL_ID = ?
  48. LOAD_MESSAGES=SELECT MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, HEADERS, PAYLOAD, TYPE FROM JBM_MSG
  49. INSERT_MESSAGE=INSERT INTO JBM_MSG (MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, TYPE, HEADERS, PAYLOAD) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
  50. INSERT_MESSAGE_CONDITIONAL=INSERT INTO JBM_MSG (MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, TYPE) SELECT ?, ?, ?, ?, ?, ? FROM JBM_DUAL WHERE NOT EXISTS (SELECT MESSAGE_ID FROM JBM_MSG WHERE MESSAGE_ID = ?)
  51. UPDATE_MESSAGE_4CONDITIONAL=UPDATE JBM_MSG SET HEADERS=?, PAYLOAD=? WHERE MESSAGE_ID=?
  52. INSERT_MESSAGE_CONDITIONAL_FULL=INSERT INTO JBM_MSG (MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, TYPE, HEADERS, PAYLOAD) SELECT ?, ?, ?, ?, ?, ?, ?, ? FROM JBM_DUAL WHERE NOT EXISTS (SELECT MESSAGE_ID FROM JBM_MSG WHERE MESSAGE_ID = ?)
  53. MESSAGE_ID_COLUMN=MESSAGE_ID
  54. DELETE_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ? AND NOT EXISTS (SELECT JBM_MSG_REF.MESSAGE_ID FROM JBM_MSG_REF WHERE JBM_MSG_REF.MESSAGE_ID = ?)
  55. INSERT_TRANSACTION=INSERT INTO JBM_TX (NODE_ID, TRANSACTION_ID, BRANCH_QUAL, FORMAT_ID, GLOBAL_TXID) VALUES(?, ?, ?, ?, ?)
  56. DELETE_TRANSACTION=DELETE FROM JBM_TX WHERE NODE_ID = ? AND TRANSACTION_ID = ?
  57. SELECT_PREPARED_TRANSACTIONS=SELECT TRANSACTION_ID, BRANCH_QUAL, FORMAT_ID, GLOBAL_TXID FROM JBM_TX WHERE NODE_ID = ?
  58. SELECT_MESSAGE_ID_FOR_REF=SELECT MESSAGE_ID, CHANNEL_ID FROM JBM_MSG_REF WHERE TRANSACTION_ID = ? AND STATE = '+' ORDER BY ORD
  59. SELECT_MESSAGE_ID_FOR_ACK=SELECT MESSAGE_ID, CHANNEL_ID FROM JBM_MSG_REF WHERE TRANSACTION_ID = ? AND STATE = '-' ORDER BY ORD
  60. UPDATE_COUNTER=UPDATE JBM_COUNTER SET NEXT_ID = ? WHERE NAME=?
  61. SELECT_COUNTER=SELECT NEXT_ID FROM JBM_COUNTER WHERE NAME=? FOR UPDATE
  62. INSERT_COUNTER=INSERT INTO JBM_COUNTER (NAME, NEXT_ID) VALUES (?, ?)
  63. SELECT_ALL_CHANNELS=SELECT DISTINCT(CHANNEL_ID) FROM JBM_MSG_REF
  64. UPDATE_TX=UPDATE JBM_TX SET NODE_ID=? WHERE NODE_ID=?
  65. UPDATE_ID_IN_CACHE=UPDATE JBM_ID_CACHE SET JBM_ID = ? WHERE NODE_ID = ? AND CNTR = ?
  66. INSERT_ID_IN_CACHE=INSERT INTO JBM_ID_CACHE (NODE_ID, CNTR, JBM_ID) VALUES (?, ?, ?)
  67. LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
  68. ]]></attribute>
  69. <!-- The maximum number of parameters to include in a prepared statement -->
  70. <attribute name="MaxParams">500</attribute>
  71. </mbean>
  72. <!-- Messaging Post Office MBean configuration========================================= -->
  73. <mbean code="org.jboss.messaging.core.jmx.MessagingPostOfficeService" name="jboss.messaging:service=PostOffice" xmbean-dd="xmdesc/MessagingPostOffice-xmbean.xml">
  74. <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
  75. <depends>jboss.jca:service=DataSourceBinding,name=DefaultDS</depends>
  76. <depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager</depends>
  77. <!-- The name of the post office -->
  78. <attribute name="PostOfficeName">JMS post office</attribute>
  79. <!-- The datasource used by the post office to access it's binding information -->
  80. <attribute name="DataSource">java:/DefaultDS</attribute>
  81. <!-- If true will attempt to create tables and indexes on every start-up -->
  82. <attribute name="CreateTablesOnStartup">true</attribute>
  83. <attribute name="SqlProperties"><![CDATA[
  84. CREATE_POSTOFFICE_TABLE=CREATE TABLE JBM_POSTOFFICE (POSTOFFICE_NAME VARCHAR2(255), NODE_ID INTEGER, QUEUE_NAME VARCHAR2(255), COND VARCHAR2(1023), SELECTOR VARCHAR2(1023), CHANNEL_ID INTEGER, CLUSTERED CHAR(1), ALL_NODES CHAR(1), PRIMARY KEY(POSTOFFICE_NAME, NODE_ID, QUEUE_NAME))
  85. INSERT_BINDING=INSERT INTO JBM_POSTOFFICE (POSTOFFICE_NAME, NODE_ID, QUEUE_NAME, COND, SELECTOR, CHANNEL_ID, CLUSTERED, ALL_NODES) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
  86. DELETE_BINDING=DELETE FROM JBM_POSTOFFICE WHERE POSTOFFICE_NAME=? AND NODE_ID=? AND QUEUE_NAME=?
  87. LOAD_BINDINGS=SELECT QUEUE_NAME, COND, SELECTOR, CHANNEL_ID, CLUSTERED, ALL_NODES FROM JBM_POSTOFFICE WHERE POSTOFFICE_NAME=? AND NODE_ID=?
  88. ]]></attribute>
  89. <!-- This post office is non clustered. If you want a clustered post office then set to true -->
  90. <attribute name="Clustered">false</attribute>
  91. <!-- All the remaining properties only have to be specified if the post office is clustered.You can safely comment them out if your post office is non clustered -->
  92. <!-- The JGroups group name that the post office will use -->
  93. <attribute name="GroupName">${jboss.messaging.groupname:MessagingPostOffice}</attribute>
  94. <!-- Max time to wait for state to arrive when the post office joins the cluster -->
  95. <attribute name="StateTimeout">30000</attribute>
  96. <!-- Max time to wait for a synchronous call to node members using the MessageDispatcher -->
  97. <attribute name="CastTimeout">30000</attribute>
  98. <!-- Set this to true if you want failover of connections to occur when a node is shut down -->
  99. <attribute name="FailoverOnNodeLeave">false</attribute>
  100. <depends optional-attribute-name="ChannelFactoryName">jboss.jgroups:service=ChannelFactory</depends>
  101. <attribute name="ControlChannelName">jbm-control</attribute>
  102. <attribute name="DataChannelName">jbm-data</attribute>
  103. <attribute name="ChannelPartitionName">${jboss.partition.name:DefaultPartition}-JMS</attribute>
  104. </mbean>
  105. <!-- Messaging JMS User Manager MBean config======================================= -->
  106. <mbean code="org.jboss.jms.server.plugin.JDBCJMSUserManagerService" name="jboss.messaging:service=JMSUserManager" xmbean-dd="xmdesc/JMSUserManager-xmbean.xml">
  107. <depends>jboss.jca:service=DataSourceBinding,name=DefaultDS</depends>
  108. <depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager</depends>
  109. <attribute name="DataSource">java:/DefaultDS</attribute>
  110. <attribute name="CreateTablesOnStartup">true</attribute>
  111. <attribute name="SqlProperties"><![CDATA[
  112. CREATE_USER_TABLE=CREATE TABLE JBM_USER (USER_ID VARCHAR2(32) NOT NULL, PASSWD VARCHAR2(32) NOT NULL, CLIENTID VARCHAR2(128), PRIMARY KEY(USER_ID))
  113. CREATE_ROLE_TABLE=CREATE TABLE JBM_ROLE (ROLE_ID VARCHAR2(32) NOT NULL, USER_ID VARCHAR2(32) NOT NULL, PRIMARY KEY(USER_ID, ROLE_ID))
  114. SELECT_PRECONF_CLIENTID=SELECT CLIENTID FROM JBM_USER WHERE USER_ID=?
  115. POPULATE.TABLES.1  = INSERT INTO JBM_USER (USER_ID, PASSWD) VALUES ('guest', 'guest')
  116. POPULATE.TABLES.2  = INSERT INTO JBM_USER (USER_ID, PASSWD) VALUES ('j2ee', 'j2ee')
  117. POPULATE.TABLES.3  = INSERT INTO JBM_USER (USER_ID, PASSWD, CLIENTID) VALUES ('john', 'needle','DurableSubscriberExample')
  118. POPULATE.TABLES.4  = INSERT INTO JBM_USER (USER_ID, PASSWD) VALUES ('nobody', 'nobody')
  119. POPULATE.TABLES.5  = INSERT INTO JBM_USER (USER_ID, PASSWD) VALUES ('dynsub', 'dynsub')
  120. POPULATE.TABLES.6  = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('guest','guest')
  121. POPULATE.TABLES.7  = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('j2ee','guest')
  122. POPULATE.TABLES.8  = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('john','guest')
  123. POPULATE.TABLES.9  = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('subscriber','john')
  124. POPULATE.TABLES.10 = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('publisher','john')
  125. POPULATE.TABLES.11 = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('publisher','dynsub')
  126. POPULATE.TABLES.12 = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('durpublisher','john')
  127. POPULATE.TABLES.13 = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('durpublisher','dynsub')
  128. POPULATE.TABLES.14 = INSERT INTO JBM_ROLE (ROLE_ID, USER_ID) VALUES ('noacc','nobody')
  129. ]]></attribute>
  130. </mbean>
  131. </server>

Open \conf\login-config.xml and add these lines


  1. <application-policy name = "messaging">
  2. <authentication>
  3. <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required" >
  4. <module-option name = "unauthenticatedIdentity">guest</module-option>
  5. <module-option name = "dsJndiName">java:/jdbc/ProfilesDS</module-option>
  6. <module-option name = "principalsQuery">
  7. SELECT PASSWD FROM JBM_USER WHERE  USER_ID=?
  8. </module-option>
  9. <module-option name = "rolesQuery">
  10. SELECT ROLE_ID, 'Roles' FROM JBM_ROLE WHERE USER_ID=?
  11. </module-option>
  12. </login-module>
  13. </authentication>
  14. </application-policy>