ActiveMQ可以将資料持久化到資料庫中,用于容災備份恢複,可以使用任意的資料庫。
1、找到activemq.xml檔案
2、在檔案中添加資料庫的bean
<bean id="activemq-mysql" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/activemq?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
3、修改persistenceAdapter
找到<persistenceAdapter>标簽,把原來的<kahaDB directory="${activemq.data}/kahadb"/>标簽注釋掉,使用jdbcPersistenceAdapter标簽,引用上一步建立的bean,等JDBC持久化完成并啟動activeMQ後,回來把createTablesOnStartup改為false(createTablesOnStartup是否在啟動的時候建立資料表,預設值是true,這樣每次啟動都會去建立資料表了,一般是第一次啟動的時候設定為true,之後改成false)
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#activemq-mysql" createTablesOnStartup="true"/>
</persistenceAdapter>
4、建立第二步所對應的資料庫,這裡即“activemq”
5、向activeMQ的lib目錄下添加所需要的jar包,點選下載下傳所需要的jar包。
6、啟動activeMQ
7、檢視mysql,是否有表生成,有表生成代表成功

8、發送一條消息,檢視資料庫中是否有消息記錄,有記錄表示消息的持久化完成
9、進行消息的消費,消費之後,資料庫中的記錄删除
10、表說明:
activemq_msgs用于存儲消息,Queue和Topic都存儲在這個表中:
ID:自增的資料庫主鍵
CONTAINER:消息的Destination
MSGID_PROD:消息發送者用戶端的主鍵
MSG_SEQ:是發送消息的順序,MSGID_PROD+MSG_SEQ可以組成JMS的MessageID
EXPIRATION:消息的過期時間,存儲的是從1970-01-01到現在的毫秒數
MSG:消息本體的Java序列化對象的二進制資料
PRIORITY:優先級,從0-9,數值越大優先級越高
activemq_acks用于存儲訂閱關系。如果是持久化Topic,訂閱者和伺服器的訂閱關系在這個表儲存:
主要的資料庫字段如下:
CONTAINER:消息的Destination
SUB_DEST:如果是使用Static叢集,這個字段會有叢集其他系統的資訊
CLIENT_ID:每個訂閱者都必須有一個唯一的用戶端ID用以區分
SUB_NAME:訂閱者名稱
SELECTOR:選擇器,可以選擇隻消費滿足條件的消息。條件可以用自定義屬性實作,可支援多屬性AND和OR操作
LAST_ACKED_ID:記錄消費過的消息的ID。
表activemq_lock在叢集環境中才有用,隻有一個Broker可以獲得消息,稱為Master Broker,
其他的隻能作為備份等待Master Broker不可用,才可能成為下一個Master Broker。
這個表用于記錄哪個Broker是目前的Master Broker。
11、必要性:
隻有在消息必須保證有效,且絕對不能丢失的時候。使用JDBC存儲政策