持久化存储支持类型
- KahaDB存储(默认存储方式)
- JDBC存储 Memory存储
- LevelDB存储
- JDBC With ActiveMQ Journal
正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的。能够存储的最大消息数据在
${ActiveMQ_HOME}/conf/activemq.xml文件中的systemUsage节点
SystemUsage配置设置了一些系统内存和硬盘容量
activemq.xml
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
mysql持久化
第一步:注释调kahadb,添加mysql配置
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true" />
</persistenceAdapter>
第二步:添加mysql数据源配置的bean
<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:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
第三步:在activemq更目录的\lib目录下添加以下3个jar包
数据库连接池:commons-dbcp-1.4.jar、commons-pool-1.6.jar
mysql JDBC驱动包:mysql-connector-java-5.1.35.jar
第四步:新建数据库activemq并重启activemq
重启后会自动创建3个表:
activemq_msgs 消息表,queue和topic都存在这个表中
activemq_acks 存储持久订阅的信息和最后一个持久订阅接收的消息ID
activemq_locks 锁表,用来确保某一时刻,只能有一个ActiveMQ broker实例来访问数据库
之后发送一个持久化消息不消费掉可以看到数据库表中有数据了
JDBC Message store with ActiveMQ Journal
ActiveMQ Journal,使用高速缓存写入技术,大大提高了性能
journal文件能够大大减少需要写入到DB中的消息
如果消费者的消费速度很慢,这个时候journal文件可以使消息以批量方式写到DB
配置好mysql后把persistenceAdapter注释掉添加persistenceFactory即可使用Journal
<!--
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true" />
</persistenceAdapter>
-->
<persistenceFactory>
<journalPersistenceAdapterFactory dataSource="#mysql-ds" dataDirectory="activemq-data"/>
</persistenceFactory>