ActiveMQ 中的訊息持久化(二)
為了長時間的儲存和管理訊息,一般會使用資料庫。在Activemq中預設使用的是Derby DB。當然也可更改配置來使用其他的DB。Activemq支援以下這些DB:
如果要使用不在上面列表中的DB,可以通過配置SQL語句和JDBC驅動來支援自己的DB。Broker在啟動的時候讀取配置檔案,若在配置檔案中指定了特定的JDBC驅動,則會在classpath路徑下自動檢測配置的JDBC驅動。下面是關於oracle的一個配置:
在InstallDir/conf/activemq-jdbc.xml有一個jdbc配置樣例。
在使用JDBC持久化的時候根據是否支援Activemq提供的高效的journal檔案分為兩種。
1、支援高效日誌
在訊息消費者能跟上生產者的速度時,journal檔案能大大減少需要寫入到DB中的訊息。舉個例子:生產者產生了10000個訊息,這10000個訊息會儲存到journal檔案中,但是消費者的速度很快,在journal檔案還未同步到DB之前,以消費了9900個訊息。那麼後面就只需要寫入100個訊息到DB了。如果消費者不能跟上生產者的速度,journal檔案可以使訊息以批量的方式寫入DB中,JDBC驅動進行DB寫入的優化。從而提升了效能。另外,journal檔案支援JMS事務的一致性。
下面是一段支援高效日誌的JDBC持久化的配置:
journaledJDBC 節點的有以下可配置屬性:
2、不使用高效日誌
下面是不使用高效日誌的配置:
可以看出,使用高效日誌的配置使在persistenceFactory節點內的。而不使用高效日誌的使配置在persistenceAdapter節點內的。
下面是jdbcPersistenceAdapter 節點可配置的屬性:
如果需要配置的DB不再Activemq預設支援的DB列表中,可以通過配置SQL語句和JDBC持久層來實現。在journaledJDBC節點下配置statements 節點來指定JDBC持久層對各類資料的處理方式。下面是一個樣例:
statements 節點的各個屬性:
定製自己插入和讀取資料的SQL語句,可以設定下面的這些屬性
設定adapter屬性可以設定JDBC介面卡儲存和訪問BLOB欄位的方式,可設定的方式有:
具體需要檢視JDBC的驅動資料庫的文件。
- Apache Derby
- Axion
- DB2
- HSQL
- Informix
- MaxDB
- MySQL
- Oracle
- Postgresql
- SQLServer
- Sybase
如果要使用不在上面列表中的DB,可以通過配置SQL語句和JDBC驅動來支援自己的DB。Broker在啟動的時候讀取配置檔案,若在配置檔案中指定了特定的JDBC驅動,則會在classpath路徑下自動檢測配置的JDBC驅動。下面是關於oracle的一個配置:
- <beans ...>
- <broker xmlns="http://activemq.apache.org/schema/core"
- brokerName="localhost">
- ...
- <persistenceAdapter>
- <jdbcPersistenceAdapter
- dataDirectory="${activemq.base}/data"
- dataSource="#oracle-ds"/>
- </persistenceAdapter>
- ...
- </broker>
- <!-- Oracle DataSource Sample Setup -->
- <bean id="oracle-ds"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
- <property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>
- <property name="username" value="scott"/>
- <property name="password" value="tiger"/>
- <property name="maxActive" value="200"/>
- <property name="poolPreparedStatements" value="true"/>
- </bean>
- </beans>
在InstallDir/conf/activemq-jdbc.xml有一個jdbc配置樣例。
在使用JDBC持久化的時候根據是否支援Activemq提供的高效的journal檔案分為兩種。
1、支援高效日誌
在訊息消費者能跟上生產者的速度時,journal檔案能大大減少需要寫入到DB中的訊息。舉個例子:生產者產生了10000個訊息,這10000個訊息會儲存到journal檔案中,但是消費者的速度很快,在journal檔案還未同步到DB之前,以消費了9900個訊息。那麼後面就只需要寫入100個訊息到DB了。如果消費者不能跟上生產者的速度,journal檔案可以使訊息以批量的方式寫入DB中,JDBC驅動進行DB寫入的優化。從而提升了效能。另外,journal檔案支援JMS事務的一致性。
下面是一段支援高效日誌的JDBC持久化的配置:
- <beans ...>
- <broker ...>
- ...
- <persistenceFactory>
- <journaledJDBC journalLogFiles="5" dataSource="#mysql-ds" />
- </persistenceFactory>
- ...
- <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="poolPreparedStatements" value="true"/>
- </bean>
- </beans>
journaledJDBC 節點的有以下可配置屬性:
屬性 | 預設值 | 描述 |
adapter | 指定持久儲存的DB | |
createTablesOnStartup | true | 是否在啟動的時候建立相應的表 |
dataDirectory | activemq-data | 指定Derby儲存資料檔案的路徑 |
dataSource | #derby | 指定要引用的資料來源 |
journalArchiveDirectory | 指定歸檔日誌檔案儲存的路徑 | |
journalLogFiles | 2 | 指定日誌檔案的數量 |
journalLogFileSize | 20MB | 指定每個日誌檔案的大小 |
journalThreadPriority | 10 | 指定寫入日誌的執行緒的優先順序 |
useDatabaseLock | true | 在主從配置的時候是否使用排他鎖 |
useJournal | true | 指定是否使用日誌 |
2、不使用高效日誌
下面是不使用高效日誌的配置:
- <beans ...>
- <broker ...>
- ...
- <persistenceAdapter>
- <jdbcPersistenceAdapter dataSource="#derby-ds" />
- </persistenceAdapter>
- ...
- <broker>
- ...
- <bean id="derby-ds" class="org.apache.derby.jdbc.EmbeddedDataSource">
- <property name="databaseName" value="derbydb"/>
- <property name="createDatabase" value="create"/>
- </bean>
- </beans>
可以看出,使用高效日誌的配置使在persistenceFactory節點內的。而不使用高效日誌的使配置在persistenceAdapter節點內的。
下面是jdbcPersistenceAdapter 節點可配置的屬性:
屬性 | 預設值 | 描述 |
adapter | 指定持久儲存的DB | |
cleanupPeriod | 300000 | 指定刪除DB中已收到確認資訊的訊息的時間週期(ms) |
createTablesOnStartup | true | 是否在啟動的時候建立相應的表 |
databaseLocker | DefaultDatabaseLocker instance | 防止多個broker同時訪問DB的鎖例項 |
dataDirectory | activemq-data | 指定Derby儲存資料檔案的路徑 |
dataSource | #derby | 指定要引用的資料來源 |
lockAcquireSleepInterval | 1000 | 等待獲取鎖的時間長度(ms) |
lockKeepAlivePeriod | 30000 | 定期向lock表中寫入當前時間,指定了鎖的存活時間 |
useDatabaseLock | true | 在主從配置的時候是否使用排他鎖 |
transactionIsolation | Connection.TRANSACTION_READ_UNCOMMITTED | 指定事務隔離級別 |
如果需要配置的DB不再Activemq預設支援的DB列表中,可以通過配置SQL語句和JDBC持久層來實現。在journaledJDBC節點下配置statements 節點來指定JDBC持久層對各類資料的處理方式。下面是一個樣例:
- <persistenceFactory>
- <journaledJDBC ...>
- <statements>
- <statements stringIdDataType ="VARCHAR(128)"/>
- </statements>
- </journaledJDBC>
- </persistenceFactory>
statements 節點的各個屬性:
屬性 | 預設值 | 描述 |
tablePrefix | 指定建立的表名的字首 | |
messageTableName | ACTIVEMQ_MSGS | 儲存訊息內容的表名 |
durableSubAcksTableName | ACTIVEMQ_ACKS | 儲存持久訂閱者的確認訊息的表名 |
lockTableName | ACTIVEMQ_LOCK | lock表名 |
binaryDataType | BLOB | 指定存放訊息的資料型別 |
containerNameDataType | VARCHAR(250) | 指定存放Destination名稱的資料型別 |
msgIdDataType | VARCHAR(250) | 存放訊息ID的資料型別 |
sequenceDataType | INTEGER | 存放訊息序列ID的資料型別 |
longDataType | BIGINT | DB中存放JAVA中long型的資料型別 |
stringIdDataType | VARCHAR(250) | 存放長字串的DB資料型別 |
定製自己插入和讀取資料的SQL語句,可以設定下面的這些屬性
- addMessageStatement
- updateMessageStatement
- removeMessageStatement
- findMessageSequenceIdStatement
- findMessageStatement
- findAllMessagesStatement
- findLastSequenceIdInMsgsStatement
- findLastSequenceIdInAcksStatement
- createDurableSubStatement
- findDurableSubStatement
- findAllDurableSubsStatement
- updateLastAckOfDurableSubStatement
- deleteSubscriptionStatement
- findAllDurableSubMessagesStatement
- findDurableSubMessagesStatement
- findAllDestinationsStatement
- removeAllMessagesStatement
- removeAllSubscriptionsStatement
- deleteOldMessagesStatement
- lockCreateStatement
- lockUpdateStatement
- nextDurableSubscriberMessageStatement
- durableSubscriberMessageCountStatement
- lastAckedDurableSubscriberMessageStatement
- destinationMessageCountStatement
- findNextMessageStatement
- createSchemaStatements
- dropSchemaStatements
設定adapter屬性可以設定JDBC介面卡儲存和訪問BLOB欄位的方式,可設定的方式有:
- org.activemq.store.jdbc.adapter.BlobJDBCAdapter
- org.activemq.store.jdbc.adapter.BytesJDBCAdapter
- org.activemq.store.jdbc.adapter.DefaultJDBCAdapter
- org.activemq.store.jdbc.adapter.ImageJDBCAdapter
具體需要檢視JDBC的驅動資料庫的文件。
- <broker persistent="true" ...>
- ...
- <persistenceFactory>
- <journaledJDBC adapter="org.activemq.store.jdbc.adapter.BlobJDBCAdapter" ... />
- </persistenceFactory>
- ...
- </broker>
轉載: http://berdy.iteye.com/blog/813794
相關文章
- RabbitMq中的訊息應答與持久化MQ持久化
- ActiveMQ-mysql持久化MQMySql持久化
- ActiveMQ支援的訊息協議MQ協議
- 訊息佇列之 ActiveMQ佇列MQ
- 訊息中介軟體之ActiveMQMQ
- 訊息佇列ActiveMQ的使用詳解佇列MQ
- 溫故之訊息佇列ActiveMQ佇列MQ
- Kafka之acks引數對訊息持久化的影響Kafka持久化
- 常見訊息中介軟體之ActiveMQMQ
- 學習在.NET Core中使用RabbitMQ進行訊息傳遞之持久化(二MQ持久化
- Docker學習之搭建ActiveMQ訊息服務DockerMQ
- 訊息佇列的作用以及kafka和activemq的對比佇列KafkaMQ
- Redis原理二:持久化Redis持久化
- MVVM的資料持久化(二)——ROOM的使用MVVM持久化OOM
- Activemq構建高併發、高可用的大規模訊息系統MQ
- 快速掌握RabbitMQ(三)——訊息確認、持久化、優先順序的C#實現MQ持久化C#
- RabbitMQ使用教程(四)如何通過持久化保證訊息99.99%不丟失?MQ持久化
- 訊息中介軟體部署及比較:rabbitMQ、activeMQ、zeroMQ、rocketMQ、Kafka、redisMQKafkaRedis
- Java訊息佇列總結只需一篇解決ActiveMQ、RabbitMQ、ZJava佇列MQ
- Redis資料持久化—RDB持久化與AOF持久化Redis持久化
- MySQl 配置InnoDB持久化的優化器統計資訊MySql持久化優化
- redis學習手記(二)持久化方式Redis持久化
- 本地訊息表成為歷史,二階訊息才是王道
- 訊息佇列中的Oracle佇列Oracle
- Redis的持久化Redis持久化
- Redis 的持久化Redis持久化
- Java訊息佇列總結只需一篇解決ActiveMQ、RabbitMQ、ZeroMQ、KafkaJava佇列MQKafka
- centos6下ActiveMQ+Zookeeper訊息中介軟體叢集部署記錄CentOSMQ
- 淺談:Redis持久化機制(二)AOF篇Redis持久化
- Redis在.net中的使用(5)Redis持久化Redis持久化
- 分散式訊息通訊Kafka(二) - 原理分析分散式Kafka
- 基於可靠訊息方案的分散式事務(二):Java中的事務分散式Java
- ActiveMQ從入門到精通(二)MQ
- RDD持久化,不使用RDD持久化的問題的工作原理持久化
- Java進階專題(十九) 訊息中介軟體架構體系(1)-- ActiveMQ研究Java架構MQ
- RabbitMQ訊息佇列(二):”Hello, World“MQ佇列
- RocketMQ中Producer訊息的傳送MQ
- 用程式碼理解 ObjC 中的傳送訊息和訊息轉發OBJ
- redis系列:RDB持久化與AOF持久化Redis持久化