Show Table of Contents
6.5. Tutorial: JDBC Persistence
Overview
This tutorial provides complete instructions for installing a JDBC persistence layer into the JBoss A-MQ broker, using the MySQL database to store the broker's data. This example uses a plain JDBC persistence adapter and uses the default database schema.
This tutorial assumes you are using a standalone JBoss A-MQ container, which is the condition of the container immediately after the product is installed. It does not cover the case of a Fabric container.
Prerequisites
Before following the instructions for this tutorial, make sure that your system satisfies the following prerequisites:
- You have already installed a MySQL database server (following the instructions in the MySQL Installation Guide, including the post installation set-up and testing).
- The MySQL database server is already running.
- You have root access to the MySQL database server (that is, you have access to the
rootuser account in MySQL, which you can use to administer the database). - You have access to the Internet (so that you can install the MySQL JDBC driver bundle and the Apache Commons data source bundle, both of which must be downloaded from the Maven Central repository).
Steps to configure JDBC persistence with MySQL
To configure a standalone JBoss A-MQ broker to use JDBC persistence with MySQL, perform the following steps:
- Log into the MySQL database using the
mysqlclient shell. Enter the following command to log on as therootuser:mysql -u root -p
You will be prompted to enter therootuser password (alternatively, if the root user has no associated password, you can omit the-poption). - Add the new user account,
amq, to MySQL with password,amqPass, by entering the following command at themysqlshell prompt:mysql> CREATE USER 'amq'@'localhost' IDENTIFIED BY 'amqPass';
If you would rather create theamquser without any password, you can omit theIDENTIFIED BYclause, as follows:mysql> CREATE USER 'amq'@'localhost';
NoteThis example assumes you are invoking themysqlshell from the same host where the MySQL database server is running. If you are logging on to the MySQL database remotely, however, you should replacelocalhostin the preceding command (and subsequent commands) by the name of the host where you are invoking themysqlshell. - Grant privileges to the
amquser, enabling it to access theactivemqdatabase instance (which has yet to be created). Enter the followingGRANTcommand at themysqlshell prompt:mysql> GRANT ALL PRIVILEGES ON activemq.* TO 'amq'@'localhost' WITH GRANT OPTION;
- Create the
activemqdatabase instance, by entering the following command:mysql> CREATE DATABASE activemq;
There is no need to create any database tables at this point. The broker's JDBC persistence will automatically create the necessary tables when it starts up for the first time. - Start the JBoss A-MQ standalone container, with its default (unchanged) configuration:
cd InstallDir/bin ./amq
- Install the MySQL JDBC driver into the container, as follows:
JBossA-MQ:karaf@root> osgi:install mvn:mysql/mysql-connector-java/5.1.27
- Install the Apache Commons data source bundle, as follows:
JBossA-MQ:karaf@root> osgi:install mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-dbcp/1.4_3
- Stop the JBoss A-MQ container (for example, by entering the
shutdowncommand at the console). Now configure the broker to use JDBC persistence by editing theInstallDir/etc/activemq.xmlfile. Modify thebroker/persistenceAdapterelement and add a newbeanelement (for the MySQL data source) as follows:<beans ...> ... <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/> <property name="username" value="amq"/> <property name="password" value="amqPass"/> <property name="poolPreparedStatements" value="true"/> </bean> <broker ...> ... <persistenceAdapter> <jdbcPersistenceAdapter dataSource="#mysql-ds"/> </persistenceAdapter> ... </broker> </beans>Where the bean with the ID,mysql-ds, creates a data source instance for connecting to the MySQL database through the JDBC protocol. Note particularly the following property settings for this bean:- url
- Is used to specify a JDBC URL in the following format:
jdbc:mysql://Hostame/DBName[?Property=Value]
WhereHostnameis the host where the MySQL database server is running;DBNameis the name of the database instance used to store the broker data (which isactivemq, in this example); and you can optionally set property values,Property=Value, after the?character. - password
- If you specified a password for the
amquser when you created it, specify the password here. Otherwise, if no password was defined, specify a blank string,"".
- Restart the JBoss A-MQ container, as follows:
./amq
As the broker initializes, it automatically creates new tables in theactivemqdatabase instance to hold the broker data (this is the default behavior). - To verify that the requisite tables have been created in the
activemqdatabase instance, enter the following commands at themysqlclient shell:mysql> USE activemq; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> SHOW TABLES; +--------------------+ | Tables_in_activemq | +--------------------+ | ACTIVEMQ_ACKS | | ACTIVEMQ_LOCK | | ACTIVEMQ_MSGS | +--------------------+ 3 rows in set (0.00 sec) mysql> describe ACTIVEMQ_LOCK; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | ID | bigint(20) | NO | PRI | NULL | | | TIME | bigint(20) | YES | | NULL | | | BROKER_NAME | varchar(250) | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> describe ACTIVEMQ_MSGS -> ; +------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+-------+ | ID | bigint(20) | NO | PRI | NULL | | | CONTAINER | varchar(250) | YES | MUL | NULL | | | MSGID_PROD | varchar(250) | YES | MUL | NULL | | | MSGID_SEQ | bigint(20) | YES | | NULL | | | EXPIRATION | bigint(20) | YES | MUL | NULL | | | MSG | longblob | YES | | NULL | | | PRIORITY | bigint(20) | YES | MUL | NULL | | | XID | varchar(250) | YES | MUL | NULL | | +------------+--------------+------+-----+---------+-------+ 8 rows in set (0.00 sec)

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.