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。