ActiveMQ 中的消息持久化(二)

转载 2015年11月18日 22:34:00
为了长时间的存储和管理消息,一般会使用数据库。在Activemq中默认使用的是Derby DB。当然也可更改配置来使用其他的DB。Activemq支持以下这些DB: 
  • Apache Derby
  • Axion
  • DB2
  • HSQL
  • Informix
  • MaxDB
  • MySQL
  • Oracle
  • Postgresql
  • SQLServer
  • Sybase

     如果要使用不在上面列表中的DB,可以通过配置SQL语句和JDBC驱动来支持自己的DB。Broker在启动的时候读取配置文件,若在配置文件中指定了特定的JDBC驱动,则会在classpath路径下自动检测配置的JDBC驱动。下面是关于oracle的一个配置: 
Xml代码  收藏代码
  1. <beans ...>  
  2.   <broker xmlns="http://activemq.apache.org/schema/core"  
  3.           brokerName="localhost">  
  4.     ...  
  5.     <persistenceAdapter>  
  6.        <jdbcPersistenceAdapter  
  7.             dataDirectory="${activemq.base}/data"  
  8.             dataSource="#oracle-ds"/>  
  9.     </persistenceAdapter>  
  10.     ...  
  11.   </broker>  
  12.    
  13.   <!-- Oracle DataSource Sample Setup -->  
  14.   <bean id="oracle-ds"  
  15.         class="org.apache.commons.dbcp.BasicDataSource"  
  16.         destroy-method="close">  
  17.     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  18.     <property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>  
  19.     <property name="username" value="scott"/>  
  20.     <property name="password" value="tiger"/>  
  21.     <property name="maxActive" value="200"/>  
  22.     <property name="poolPreparedStatements" value="true"/>  
  23.   </bean>  
  24.   
  25. </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持久化的配置: 
Xml代码  收藏代码
  1. <beans ...>  
  2.   <broker ...>  
  3.     ...  
  4.   <persistenceFactory>  
  5.     <journaledJDBC journalLogFiles="5" dataSource="#mysql-ds" />  
  6.     </persistenceFactory>  
  7.     ...  
  8.   <broker>  
  9.   ...  
  10. <bean id="mysql-ds"  
  11.       class="org.apache.commons.dbcp.BasicDataSource"  
  12.       destroy-method="close">  
  13.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  14.     <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>  
  15.     <property name="username" value="activemq"/>  
  16.     <property name="password" value="activemq"/>  
  17.     <property name="poolPreparedStatements" value="true"/>  
  18.   </bean>  
  19. </beans>  

journaledJDBC 节点的有以下可配置属性: 
属性 默认值 描述
adapter   指定持久存储的DB
createTablesOnStartup true 是否在启动的时候创建相应的表
dataDirectory activemq-data 指定Derby存储数据文件的路径
dataSource #derby 指定要引用的数据源
journalArchiveDirectory   指定归档日志文件存储的路径
journalLogFiles 2 指定日志文件的数量
journalLogFileSize 20MB 指定每个日志文件的大小
journalThreadPriority 10 指定写入日志的线程的优先级
useDatabaseLock true 在主从配置的时候是否使用排他锁
useJournal true 指定是否使用日志

2、不使用高效日志 
下面是不使用高效日志的配置: 
Xml代码  收藏代码
  1. <beans ...>  
  2.   <broker ...>  
  3.   ...  
  4.   <persistenceAdapter>  
  5.     <jdbcPersistenceAdapter dataSource="#derby-ds" />  
  6.     </persistenceAdapter>  
  7.     ...  
  8.   <broker>  
  9.   ...  
  10. <bean id="derby-ds" class="org.apache.derby.jdbc.EmbeddedDataSource">  
  11.     <property name="databaseName" value="derbydb"/>  
  12.     <property name="createDatabase" value="create"/>  
  13.   </bean>  
  14. </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持久层对各类数据的处理方式。下面是一个样例: 
Xml代码  收藏代码
  1. <persistenceFactory>  
  2.   <journaledJDBC ...>  
  3.     <statements>  
  4.       <statements stringIdDataType ="VARCHAR(128)"/>  
  5.     </statements>  
  6.   </journaledJDBC>  
  7. </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的驱动数据库的文档。 
Xml代码  收藏代码
  1. <broker persistent="true" ...>  
  2.   ...  
  3.   <persistenceFactory>  
  4.     <journaledJDBC adapter="org.activemq.store.jdbc.adapter.BlobJDBCAdapter" ... />  
  5.   </persistenceFactory>  
  6.   ...  
  7. </broker>  

转载: http://berdy.iteye.com/blog/813794

相关文章推荐

ActiveMQ启动时报锁定数据库的问题解决

原因是:activeMQ的broker在启动时会锁定数据库。我们每个人在调试时,自己的运行环境中就会运行一个broker,所以会出现争用锁的现象(如果只有一个人运行则不会出现这样的问题),报错如下: ...

我的activemq JDBC Master Slave主从和持久化配置过程

今天的目标是安装好activemq的JDBC Master Slave主从集群,要求是当一台消息队列服务器挂了,或者维护重启的时候不会影响平台正常运行。 首先就是安装mysql数据库,这个已经安装过...

activemq消息持久化所需Jar包

  • 2017年04月03日 21:20
  • 1.54MB
  • 下载

ActiveMQ使用笔记(二)ActiveMQ消息持久化(2)

2、KahaDB KahaDB是基于文件的本地数据库储存形式,虽然没有AMQ的速度快,但是它具有强扩展性,恢复的时间比AMQ短,从5.4版本之后KahaDB做为默认的持久化方式。默认配置如下: ...
  • viproc
  • viproc
  • 2012年09月24日 21:21
  • 1109

activemq+spring 持久化发送消息

转:http://blog.csdn.net/u010741376/article/details/51254436 JMS 即 Java message service 是为java提供了...

ActiveMQ -- 消息持久化

消息持久化,就是将消息进行一个存储。如图所示,主题中的消息都是持久化后的,订阅同一topic的用户,都有自己的一个指针记录,消息处理的进展。KahaDB存储 基于文件形式存储的。 基于文件存储,不需要...

ActiveMQ持久化消息的三种方式

ActiveMQ持久化消息的三种方式 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle。下面逐一介绍。 A:持久化为文件      这个你装ActiveM...

JMS之——ActiveMQ消息持久化

之前的几篇博文中,我们实现的ActiveMQ消息未实现消息的持久化,一旦ActiveMQ服务重启则未发送的消息全部丢失,所以实现ActiveMQ消息的持久化也是很重要的。那么,这篇文章,我就带着大家一...

JMS之activemq消息持久化

JMS 即 java message service 是为java提供了一种创建、发送、接收消息的通用方法。可以将复杂的系统进行业务分离,变成灵活的高度解耦合的布局。同时对我们的日常业务需求开发,提供...

activemq 支持mysql持久化 消息队列使用

目前官网上的5.x.x版本都不能下载,故使用4.1.2版本进行测试   下载地址  下载下来的包解压后为绿色版的,除了配置java_home环境变量,其他不需要安装,可以直接启动。  启动命令...
  • lucett
  • lucett
  • 2011年10月17日 15:04
  • 2103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveMQ 中的消息持久化(二)
举报原因:
原因补充:

(最多只允许输入30个字)