前言
本章讲解ActiveMQ的持久化策略
方法
1.概念
我们都知道,之前我们学习redis的时候学习了它有关的持久化策略,那么MQ也是如此,我们在之前的学习中重启MQ的话,之前代码产生的数据都会消失不见,这是十分可怕的,所以有必要学习其持久化策略。
2.ActiveMQ的持久化策略
1)Kahadb模式
这个模式是默认的持久化策略。
我们通过conf文件夹下的activemq.xml中有关的配置项可以看到:
这个模式存在诸多问题,但是效率很高,因为是基于内存的。
但是一旦我们重启MQ,那么该持久化策略将无力保障数据的安全。
2)JDBC模式
为了保证数据的安全性,我们牺牲一下效率,采用JDBC模式进行消息的持久化。
这种持久化的原理在于将消息信息存储于相应的数据库中,保证了数据的完整性。
那么我们需要进行如下的配置:
1.我们本次使用Oracle 11g来进行消息的持久化操作,我们需要实现准备有一台安装有Oracle 11g的环境,由于我的主机已经安装好了Oracle数据库,所以我就不在linux上安装啦,直接启动windows的oracle服务:
验证登录:
这证明我windows的Oracle完全可用,当然你如果安装在linux也行。
2. 我们对activemq.xml进行如下配置:
在<broker>标签内注释之前的kahadb模式的持久化策略。添加如下JDBC的持久化策略适配器:
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracleDataSource" createTablesOnStartup="true" />
</persistenceAdapter>
在<broker/>标签下添加数据库连接池信息,本次使用的是dbcp连接池,因为该连接池的jar包默认有配置。
<!-- 配置JDBC持久化策略的连接池信息 -->
<bean id="oracleDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@192.168.1.102:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<property name="maxTotal" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
3.准备相关jar包放入activeMQ的lib文件夹中
由于需要连接Oracle数据库,我们首先需要准备一下Oracle的数据库驱动包放入lib中如下所示:
因为dbcp连接池的相关jar包已经默认存在了,所以我们无需引入。
4.运行ActiveMQ查看效果
数据库中出现了三张用于ActiveMQ持久化的表:
- activemq_msgs:queue和topic的消息都存在这个表中
- activemq_acks:存储持久订阅的信息和最后一个持久订阅接收的消息ID
- activemq_lock:跟kahadb的lock文件类似,确保数据库在某一时刻只有一个broker在访问
表创建完成后,需要将下面配置文件的true改为flase,以免每次都创建表:
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracleDataSource" createTablesOnStartup="false" />
</persistenceAdapter>
我们执行生产者代码:
这个时候我们重启MQ,通过之前的代码向MQ中添加数据,测试重启后是否会消失:
重启前:
重启后: