一、简介
ActiveMQ中,持久化是指对消息数据的持久化。在ActiveMQ中,默认的消息是保存在内存中的。当内存容量不足的时候,或ActiveMQ正常关闭的时候,会将内存中的未处理的消息持久化到磁盘中。具体的持久化策略由配置文件中的具体配置决定。
ActiveMQ的默认存储策略是kahadb。如果使用JDBC作为持久化策略,则会将所有的需要持久化的消息保存到数据库中。
所有的持久化配置都在conf/activemq.xml中配置,配置信息都在broker标签内部定义。
二、kahadb方式
ActiveMQ默认的持久化策略(activemq.xml)。kahadb是一个文件型数据库。是使用内存+文件保证数据的持久化的。
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
特性:
1、日志形式存储消息;
2、消息索引以B-Tree结构存储,可以快速更新;
3、完全支持JMS事务;
4、支持多种恢复机制;
三、JDBC持久化
ActiveMQ将数据持久化到数据库中,可以使用任意的数据库。 本环节中使用MySQL数据库。
1.activemq.xml 中配置一个数据源bean:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/db_test2" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
2.activemq.xml broker 中修改 persistenceAdapter 节点内容为:
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#dataSource" createTablesOnStartup="true" />
</persistenceAdapter>
3.mysql 数据库中创建db_test2 数据库,库中的表activemq 会自动创建
4.activemq 安装路径 lib 目录中添加 jar 包:
spring-jdbc-4.3.25.RELEASE.jar
mysql-connector-java-5.1.22.jar
5.启动mysql 数据库,启动activemq 后查看mysql db_test2 库:
activemq_msgs用于存储消息,Queue和Topic都存储在这个表中
注意:jdbcPersistenceAdapter 配置了createTablesOnStartup=true,将在每次重启activemq 时删除表中数据,故防止数据被删除,第一次启动后停止activemq,并把createTablesOnStartup修改为false.
6.producer 发送数据到mq 中:
ConnectionFactory factory = new ActiveMQConnectionFactory("vincent2","123456","tcp://localhost:61616");
Connection connection = null;
Session session = null;
try {
connection = factory.createConnection();
connection.start();
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination destination = session.createQueue("first_mq");
MessageProducer producer = session.createProducer(destination);
TextMessage msg = session.createTextMessage("");
for(int i=0;i<10;i++) {
msg.setText("你好" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
producer.send(msg);
}
} catch (JMSException e) {
e.printStackTrace();
}
finally {
if(session != null) {
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
7.查看activemq_msgs 表:
8.consumer 消费数据后: