1. 程式人生 > >ActiveMQ的JDBC訊息持久化機制

ActiveMQ的JDBC訊息持久化機制

為了避免意外宕機以後丟失資訊,需要做到重啟後可以恢復訊息佇列,訊息系統一般都會採用持久化機制。

ActiveMQ的訊息持久化機制有JDBC,AMQ,KahaDB和LevelDB,無論使用哪種持久化方式,訊息的儲存邏輯都是一致的。

就是在傳送者將訊息傳送出去後,訊息中心首先將訊息儲存到本地資料檔案、記憶體資料庫或者遠端資料庫等,然後試圖將訊息傳送給接收者,傳送成功則將訊息從儲存中刪除,失敗則繼續嘗試。

訊息中心啟動以後首先要檢查指定的儲存位置,如果有未傳送成功的訊息,則需要把訊息傳送出去。

>> JDBC持久化方式

使用JDBC持久化方式,資料庫會建立3個表:activemq_msgs,activemq_acks和activemq_lock。
activemq_msgs用於儲存訊息,Queue和Topic都儲存在這個表中。

(1)配置方式

配置持久化的方式,都是修改安裝目錄下conf/acticvemq.xml檔案,

首先定義一個mysql-ds的MySQL資料來源,然後在persistenceAdapter節點中配置jdbcPersistenceAdapter並且引用剛才定義的資料來源。

<persistenceAdapter> 
    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false" /> 
</persistenceAdapter>

dataSource指定持久化資料庫的bean,createTablesOnStartup是否在啟動的時候建立資料表,預設值是true,這樣每次啟動都會去建立資料表了,一般是第一次啟動的時候設定為true,之後改成false。

使用MySQL配置JDBC持久化:

<beans>
    <broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
        <persistenceAdapter>
            <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
        </persistenceAdapter>
    </broker>
    <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="activemq"/>
        <property name="password" value="activemq"/>
        <property name="maxActive" value="200"/>
        <property name="poolPreparedStatements" value="true"/>
    </bean>
</beans>

(2)資料庫表資訊
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。