ActiveMQ 持久化

本文介绍了ActiveMQ的持久化机制,包括默认的kahadb存储方式及其特性,如日志存储和B-Tree索引。此外,还详细阐述了如何配置JDBC持久化,将消息保存到MySQL数据库,并警告了在配置createTablesOnStartup属性时防止数据丢失的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

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 消费数据后:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值