天天看點

ActiveMQ JDBC持久化

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&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC&amp;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,是否有表生成,有表生成代表成功

ActiveMQ JDBC持久化

8、發送一條消息,檢視資料庫中是否有消息記錄,有記錄表示消息的持久化完成

ActiveMQ JDBC持久化

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存儲政策