| 10 April 2007 |
Last week I installed JBoss Messaging 1.2.0.GA on our JBoss 4.0.5.GA instance. In this blog I will state the steps we performed to install the extension and configure it for our application. I am not sure this will be THE way to do it, but this is how it worked for us. Please note that JBoss Messaging will be standard in JBoss 5, but since we are working with JBoss 4.0.5 we have to install it ourselves.
- Well, as usual, the first step is to download the extension at this link. After obtaining the zip we extract it in some temporary directory.
- Second step is necessary if you don't have Ant 1.7 running at your machine already. This version of Ant is necessary for the installation. So if it is not at your machine you can download it here. Follow the instructions supplied with it to install it.
- Third step is also necessary if there hasn't been set a environment variable called 'JBOSS_HOME' pointing to your JBoss root directory. This environment variable is used by the Ant script to determine where to install the JBoss extension.
When this is all set you can browse to the directory '/jboss-messaging-1.2.0.GA/util' of the extracted jboss-messaging zip file and run Ant with the following command:
ant -f release-admin.xml
With this command the extension is installed and you will see in your JBoss instance a new server directory called 'messaging'. The next steps are the steps we performed to configure some queues and make them persisting themselves in a PostgreSQL 8 database.
To have JBoss persit its messages from the queue to Postgres it needs access to the Postgres JDBC driver. Therefor you need to copy the file 'postgresql-8.1-404.jdbc3.jar' (or your version) to the directory '$JBOSS_HOME$/server/messaging/lib'.
To tell JBoss how to access the Postgres database (define a datasource) we put a file called 'postgres-ds.xml' in the directory '$JBOSS_HOME$/server/bag/deploy/'. The file has the following content:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<datasources>
-
<local-tx-datasource>
-
<jndi-name>JmsDS</jndi-name>
-
<connection-url>jdbc:postgresql://localhost/jms</connection-url>
-
<driver-class>org.postgresql.Driver</driver-class>
-
<user-name>jms</user-name>
-
<password>jms</password>
-
<new-connection-sql>select 1</new-connection-sql>
-
<check-valid-connection-sql>select 1</check-valid-connection-sql>
-
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
-
<metadata>
-
<type-mapping>PostgreSQL 8.1</type-mapping>
-
</metadata>
-
</local-tx-datasource>
-
</datasources>
As you can see in the file it tries to connect to a database called 'JMS' at the localhost. It uses username 'JMS' and password 'JMS'. You must make sure this database exists and the user JMS has the rights to create database objects in the database.
Now JBoss is ready and we have to define the queues in JBoss Messaging. Since we use the default ConnectionFactory we do not have to add one and we just add a MBean to the file 'destinations-service.xml' in the directory '$JBOSS_HOME/server/messaging/deploy/jboss-messaging.sar/':
-
<mbean code="org.jboss.jms.server.destination.QueueService"
-
name="jboss.messaging.destination:service=Queue,name=BagQueue"
-
xmbean-dd="xmdesc/Queue-xmbean.xml">
-
<depends optional-attribute-name="ServerPeer"> jboss.messaging:service=ServerPeer</depends>
-
<depends>jboss.messaging:service=PostOffice</depends>
-
</mbean>
There is one more file that must be added to the directory '$JBOSS_HOME/server/bag/deploy/jboss-messaging.sar/': 'postgresql-persistence-service.xml'. The contents of this file:
-
<?xml version="1.0" encoding="utf-8"?>
-
-
<!--
-
Postgresql non-clustered persistence deployment descriptor.
-
Tested with PostgresSQL 8.1.5
-
$Id: postgresql-persistence-service.xml 2449 2007-02-26 19:25:34Z timfox $
-
-->
-
-
<server>
-
-
<mbean code="org.jboss.messaging.core.plugin.JDBCPersistenceManagerService"
-
name="jboss.messaging:service=PgPersistenceManager"
-
xmbean-dd="xmdesc/JDBCPersistenceManager-xmbean.xml">
-
<depends>jboss.jca:service=DataSourceBinding,name=JmsDS</depends>
-
<depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager</depends>
-
<attribute name="DataSource">java:/JmsDS</attribute>
-
<attribute name="CreateTablesOnStartup">true</attribute>
-
<attribute name="UsingBatchUpdates">true</attribute>
-
<attribute name="SqlProperties"><![CDATA[
-
CREATE_MESSAGE_REFERENCE=CREATE TABLE JBM_MSG_REF (CHANNEL_ID BIGINT, MESSAGE_ID BIGINT, TRANSACTION_ID BIGINT, STATE CHAR(1), ORD BIGINT, PAGE_ORD BIGINT, DELIVERY_COUNT INTEGER, SCHED_DELIVERY BIGINT, PRIMARY KEY(CHANNEL_ID, MESSAGE_ID))
-
CREATE_IDX_MESSAGE_REF_TX=CREATE INDEX JBM_MSG_REF_TX ON JBM_MSG_REF (TRANSACTION_ID)
-
CREATE_IDX_MESSAGE_REF_ORD=CREATE INDEX JBM_MSG_REF_ORD ON JBM_MSG_REF (ORD)
-
CREATE_IDX_MESSAGE_REF_PAGE_ORD=CREATE INDEX JBM_MSG_REF_PAGE_ORD ON JBM_MSG_REF (PAGE_ORD)
-
CREATE_IDX_MESSAGE_REF_MESSAGE_ID=CREATE INDEX JBM_MSG_REF_MESSAGE_ID ON JBM_MSG_REF (MESSAGE_ID)
-
CREATE_IDX_MESSAGE_REF_SCHED_DELIVERY=CREATE INDEX JBM_MSG_REF_SCHED_DELIVERY ON JBM_MSG_REF (SCHED_DELIVERY)
-
CREATE_MESSAGE=CREATE TABLE JBM_MSG (MESSAGE_ID BIGINT, RELIABLE CHAR(1), EXPIRATION BIGINT, TIMESTAMP BIGINT, PRIORITY SMALLINT, HEADERS BYTEA, PAYLOAD BYTEA, CHANNEL_COUNT INTEGER, TYPE SMALLINT, PRIMARY KEY (MESSAGE_ID))
-
CREATE_TRANSACTION=CREATE TABLE JBM_TX (TRANSACTION_ID BIGINT, BRANCH_QUAL BYTEA, FORMAT_ID INTEGER, GLOBAL_TXID BYTEA, PRIMARY KEY (TRANSACTION_ID))
-
CREATE_COUNTER=CREATE TABLE JBM_COUNTER (NAME VARCHAR(255), NEXT_ID BIGINT, PRIMARY KEY(NAME))
-
INSERT_MESSAGE_REF=INSERT INTO JBM_MSG_REF (CHANNEL_ID, MESSAGE_ID, TRANSACTION_ID, STATE, ORD, PAGE_ORD, DELIVERY_COUNT, SCHED_DELIVERY) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
-
DELETE_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE MESSAGE_ID=? AND CHANNEL_ID=? AND STATE='C'
-
UPDATE_MESSAGE_REF=UPDATE JBM_MSG_REF SET TRANSACTION_ID=?, STATE='-' WHERE MESSAGE_ID=? AND CHANNEL_ID=? AND STATE='C'
-
UPDATE_PAGE_ORDER=UPDATE JBM_MSG_REF SET PAGE_ORD = ? WHERE MESSAGE_ID=? AND CHANNEL_ID=?
-
COMMIT_MESSAGE_REF1=UPDATE JBM_MSG_REF SET STATE='C', TRANSACTION_ID = NULL WHERE TRANSACTION_ID=? AND STATE='+'
-
COMMIT_MESSAGE_REF2=DELETE FROM JBM_MSG_REF WHERE TRANSACTION_ID=? AND STATE='-'
-
ROLLBACK_MESSAGE_REF1=DELETE FROM JBM_MSG_REF WHERE TRANSACTION_ID=? AND STATE='+'
-
ROLLBACK_MESSAGE_REF2=UPDATE JBM_MSG_REF SET STATE='C', TRANSACTION_ID = NULL WHERE TRANSACTION_ID=? AND STATE='-'
-
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
-
LOAD_UNPAGED_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? AND PAGE_ORD IS NULL ORDER BY ORD
-
LOAD_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? ORDER BY ORD
-
UPDATE_REFS_NOT_PAGED=UPDATE JBM_MSG_REF SET PAGE_ORD = NULL WHERE PAGE_ORD BETWEEN ? AND ? AND CHANNEL_ID=?
-
SELECT_MIN_MAX_PAGE_ORD=SELECT MIN(PAGE_ORD), MAX(PAGE_ORD) FROM JBM_MSG_REF WHERE CHANNEL_ID = ?
-
SELECT_EXISTS_REF=SELECT MESSAGE_ID FROM JBM_MSG_REF WHERE CHANNEL_ID = ? AND MESSAGE_ID = ?
-
SELECT_EXISTS_REF_MESSAGE_ID=SELECT MESSAGE_ID FROM JBM_MSG_REF WHERE MESSAGE_ID = ?
-
UPDATE_DELIVERY_COUNT=UPDATE JBM_MSG_REF SET DELIVERY_COUNT = ? WHERE CHANNEL_ID = ? AND MESSAGE_ID = ?
-
UPDATE_CHANNEL_ID=UPDATE JBM_MSG_REF SET CHANNEL_ID = ? WHERE CHANNEL_ID = ?
-
LOAD_MESSAGES=SELECT MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, HEADERS, PAYLOAD, TYPE FROM JBM_MSG
-
INSERT_MESSAGE=INSERT INTO JBM_MSG (MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, HEADERS, PAYLOAD, CHANNEL_COUNT, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
-
INC_CHANNEL_COUNT=UPDATE JBM_MSG SET CHANNEL_COUNT = CHANNEL_COUNT + 1 WHERE MESSAGE_ID=?
-
DEC_CHANNEL_COUNT=UPDATE JBM_MSG SET CHANNEL_COUNT = CHANNEL_COUNT - 1 WHERE MESSAGE_ID=?
-
DELETE_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID=? AND CHANNEL_COUNT=0
-
MESSAGE_ID_COLUMN=MESSAGE_ID
-
MESSAGE_EXISTS=SELECT MESSAGE_ID FROM JBM_MSG WHERE MESSAGE_ID = ? FOR UPDATE
-
INSERT_TRANSACTION=INSERT INTO JBM_TX (TRANSACTION_ID, BRANCH_QUAL, FORMAT_ID, GLOBAL_TXID) VALUES(?, ?, ?, ?)
-
DELETE_TRANSACTION=DELETE FROM JBM_TX WHERE TRANSACTION_ID = ?
-
SELECT_PREPARED_TRANSACTIONS=SELECT TRANSACTION_ID, BRANCH_QUAL, FORMAT_ID, GLOBAL_TXID FROM JBM_TX
-
SELECT_MESSAGE_ID_FOR_REF=SELECT MESSAGE_ID, CHANNEL_ID FROM JBM_MSG_REF WHERE TRANSACTION_ID = ? AND STATE = '+' ORDER BY ORD
-
SELECT_MESSAGE_ID_FOR_ACK=SELECT MESSAGE_ID, CHANNEL_ID FROM JBM_MSG_REF WHERE TRANSACTION_ID = ? AND STATE = '-' ORDER BY ORD
-
UPDATE_COUNTER=UPDATE JBM_COUNTER SET NEXT_ID = ? WHERE NAME=?
-
SELECT_COUNTER=SELECT NEXT_ID FROM JBM_COUNTER WHERE NAME=? FOR UPDATE
-
INSERT_COUNTER=INSERT INTO JBM_COUNTER (NAME, NEXT_ID) VALUES (?, ?)
-
SELECT_ALL_CHANNELS=SELECT DISTINCT(CHANNEL_ID) FROM JBM_MSG_REF
-
]]></attribute>
-
-
<attribute name="MaxParams">500</attribute>
-
</mbean>
-
-
<mbean code="org.jboss.messaging.core.plugin.DefaultPostOfficeService"
-
name="jboss.messaging:service=PostOffice"
-
xmbean-dd="xmdesc/DefaultPostOffice-xmbean.xml">
-
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
-
<depends>jboss.jca:service=DataSourceBinding,name=JmsDS</depends>
-
<depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager</depends>
-
<attribute name="PostOfficeName">JMS</attribute>
-
<attribute name="DataSource">java:/JmsDS</attribute>
-
<attribute name="CreateTablesOnStartup">true</attribute>
-
<attribute name="SqlProperties"><![CDATA[
-
CREATE_POSTOFFICE_TABLE=CREATE TABLE JBM_POSTOFFICE (POSTOFFICE_NAME VARCHAR(255), NODE_ID INTEGER, QUEUE_NAME VARCHAR(1023), COND VARCHAR(1023), SELECTOR VARCHAR(1023), CHANNEL_ID BIGINT, CLUSTERED CHAR(1))
-
INSERT_BINDING=INSERT INTO JBM_POSTOFFICE (POSTOFFICE_NAME, NODE_ID, QUEUE_NAME, COND, SELECTOR, CHANNEL_ID, CLUSTERED) VALUES (?, ?, ?, ?, ?, ?, ?)
-
DELETE_BINDING=DELETE FROM JBM_POSTOFFICE WHERE POSTOFFICE_NAME=? AND NODE_ID=? AND QUEUE_NAME=?
-
LOAD_BINDINGS=SELECT NODE_ID, QUEUE_NAME, COND, SELECTOR, CHANNEL_ID, CLUSTERED FROM JBM_POSTOFFICE WHERE POSTOFFICE_NAME = ?
-
]]></attribute>
-
</mbean>
-
-
<mbean code="org.jboss.jms.server.plugin.JDBCJMSUserManagerService"
-
name="jboss.messaging:service=JMSUserManager"
-
xmbean-dd="xmdesc/JMSUserManager-xmbean.xml">
-
<depends>jboss.jca:service=DataSourceBinding,name=JmsDS</depends>
-
<depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager</depends>
-
<attribute name="DataSource">java:/JmsDS</attribute>
-
<attribute name="CreateTablesOnStartup">true</attribute>
-
<attribute name="SqlProperties"><![CDATA[
-
CREATE_USER_TABLE=CREATE TABLE JBM_USER (USER_ID VARCHAR(32) NOT NULL, PASSWD VARCHAR(32) NOT NULL, CLIENTID VARCHAR(128), PRIMARY KEY(USER_ID))
-
CREATE_ROLE_TABLE=CREATE TABLE JBM_ROLE (ROLE_ID VARCHAR(32) NOT NULL, USER_ID VARCHAR(32) NOT NULL, PRIMARY KEY(USER_ID, ROLE_ID))
-
SELECT_PRECONF_CLIENTID=SELECT CLIENTID FROM JBM_USER WHERE USER_ID=?
-
POPULATE.TABLES.1=INSERT INTO JBM_USER (USER_ID,PASSWD,CLIENTID) VALUES ('dilbert','dogbert','dilbert-id')
-
]]></attribute>
-
</mbean>
-
-
</server>
By default the file 'hsqldb-persistence-service.xml' is added to the directory to perform the persistence with HSQLDB. This file must now be removed to avoid clashes in JBoss configuration. So remove the file.
One more thing to do is to tell the JBoss Messaging to use our new persistence manager: PgPersistenceManager. To do this edit the file 'messaging-service.xml' in the directory '$JBOSS_HOME/server/bag/deploy/jboss-messaging.sar/' and replace the next line:
-
<depends optional-attribute-name="PersistenceManager">jboss.messaging:service=PersistenceManager</depends>
with:
-
<depends optional-attribute-name="PersistenceManager">jboss.messaging:service=PgPersistenceManager</depends>
That was the final step. You should now be able to access the JMS Queues with Spring for example as I have blogged here.


2 comments to 'JBoss Messaging installation and configuration'
28 June 2007
[...] see more details about installing JBoss Messaging see this [...]
5 November 2009
[...] see more details about installing JBoss Messaging see this post). Since sending a message to a Topic is pretty straightforward I will only show how to [...]