```
ActiveMQ中,持久化是指對消息數據的持久化。在ActiveMQ中,默認的消息是保存在內存中的。
當內存容量不足的時候,或ActiveMQ正常關閉的時候,會將內存中的未處理的消息持久化到磁盤中。
具體的持久化策略由配置文件中的具體配置決定。
ActiveMQ的默認存儲策略是kahadb。如果使用JDBC作為持久化策略,則會將所有的需要持久化的消息保存到數據庫中。
所有的持久化配置都在conf/activemq.xml中配置,配置信息都在broker標簽內部定義
```
#### kahadb方式
```
ActiveMQ默認的持久化策略。kahadb是一個文件型數據庫。是使用內存+文件保證數據的持久化的。
kahadb可以限制每個數據文件的大小。不代表總計數據容量
<persistenceAdapter>
<!-- directory:保存數據的目錄; journalMaxFileLength:保存消息的文件大小 -->
<kahaDB?directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
</persistenceAdapter>
特性:
1、日志形式存儲消息
2、消息索引以B-Tree結構存儲,可以快速更新
3、完全支持JMS事務
4、支持多種恢復機制;
```
#### AMQ方式
```
只適用于5.3版本之前。
AMQ也是一個文件型數據庫,消息信息最終是存儲在文件中。內存中也會有緩存數據。
<persistenceAdapter>
<!-- directory:保存數據的目錄 ;?maxFileLength:保存消息的文件大小 -->
<amqPersistenceAdapter?directory="${activemq.data}/amq" maxFileLength="32mb"/>
</persistenceAdapter>
性能高于JDBC,寫入消息時,會將消息寫入日志文件,由于是順序追加寫,性能很高。為了提升性能,
創建消息主鍵索引,并且提供緩存機制,進一步提升性能。每個日志文件的大小都是有限制的(默認32m,可自行配置)。
當超過這個大小,系統會重新建立一個文件。當所有的消息都消費完成,系統會刪除這個文件或者歸檔。
主要的缺點是AMQ Message會為每一個Destination創建一個索引,如果使用了大量的Queue,索引文件的大小會占用很多磁盤空間。
而且由于索引巨大,一旦Broker(ActiveMQ應用實例)崩潰,重建索引的速度會非常慢。
雖然AMQ性能略高于Kaha DB方式,但是由于其重建索引時間過長,而且索引文件占用磁盤空間過大,所以已經不推薦使用。
```
#### JDBC持久化方式
```
ActiveMQ將數據持久化到數據庫中。 不指定具體的數據庫。 可以使用任意的數據庫中
一下示范使用MySQL數據庫
```
```
首先定義一個mysql-ds的MySQL數據源
然后在persistenceAdapter節點中配置jdbcPersistenceAdapter并且引用剛才定義的數據源。
dataSource指定持久化數據庫的bean,
createTablesOnStartup是否在啟動的時候創建數據表,默認值是true,
這樣每次啟動都會去創建數據表了,一般是第一次啟動的時候設置為true,之后改成false。
```
```
<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>
```
```
配置成功后,需要在數據庫中創建對應的database,否則無法訪問。表格ActiveMQ可以自動創建。
?
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。
只有在消息必須保證有效,且絕對不能丟失的時候。使用JDBC存儲策略。
如果消息可以容忍丟失,或使用集群/主備模式保證數據安全的時候,建議使用levelDB或Kahadb。
```
- JMS vs AMQP
- ActiveMQ
- 安裝
- 簡介
- 知識點
- 點對點
- 發布訂閱
- 對比
- 安全認證
- 持久化
- Api
- Productor
- 發送消息
- 消息有效期
- 消息優先級
- 開啟
- 嚴格順序
- 強順序
- Consumer
- 消息確認
- 消息的過濾
- 客戶端
- java
- 點對點
- 生產者
- 消費者
- 發布訂閱
- 生產者
- Springboot
- 配置
- QueueConfig
- 生產者
- 消費者
- 集群
- RabbitMQ
- 安裝
- 主要概念
- 消息模型
- 基本消息模型
- 簡介
- java
- 消費者
- 生產者
- 工具類
- work消息模型
- 簡介
- java
- 消費者
- 生產者
- 訂閱模型-Fanout
- 簡介
- java
- 生產者
- 消費者
- 訂閱模型-Direct
- 簡介
- java
- 生產者
- 消費者
- 訂閱模型-Topic
- 簡介
- java
- 生產者
- 消費者
- 持久化
- Spring-AMQP
- 消費者
- 生產者