ActiveMQ 消息高可用体现
- 事务
- 持久化方式
- 签收
- 消息持久化机制
官网介绍
http://activemq.apache.org/persistence
有哪些:
KahaDB消息介绍
官网介绍
http://activemq.apache.org/kahadb
activemq.xml 配置位置
意思是存储文件在 /data/kahadb/
文件内容如下所示
JDBC 消息存储
下载mysql jdbc驱动并上传到activemq安装目录/bin/ 目录下:如下所示
修改activemq.xml配置文件
修改前:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
官网介绍—
修改后:
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true" />
<!-- <kahaDB directory="${activemq.data}/kahadb"/>-->
</persistenceAdapter>
createTablesOnStartup 为true自动创建表
新增数据源配置
<!-- 数据源 -->
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.137.1:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
示例:
启动成功之后查看mysql activemq数据库会出现四张表
使用Queue 进行持久化操作:发送三条消息
mysql activemq_msgs表如下显示:
Queue接受操作之后,我们再看数据库
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
非持久化操作,数据将存储到内存中。
Topic 进行持久化操作,先监听消息,然后发送消息。查看mysql数据库
监听:
/**
* topic 持久化接收
*
* @throws JMSException
* @throws IOException
*/
@Test
public void topicDurableSubscriber() throws JMSException, IOException {
Connection connection = activeMQConnectionFactory.createConnection();
connection.setClientID("z4");
Session session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);
Topic topic = session.createTopic(TOPIC_NAME);
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "备注");
connection.start();
topicSubscriber.setMessageListener((t) -> {
if (null != t && t instanceof TextMessage) {
TextMessage t1 = (TextMessage) t;
try {
System.out.println("监听模式Topic持久化:" + t1.getText());
// t1.acknowledge();
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();//等待
}
发送消息:
/**
* topic 持久化发送
* @throws JMSException
* @throws IOException
*/
@Test
public void topicSendDurableSubscriber() throws JMSException, IOException {
Connection connection = activeMQConnectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic(TOPIC_NAME);
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
connection.start();
// 发送消息
for (int i = 1; i <= 6; i++) {
TextMessage textMessage = session.createTextMessage();
textMessage.setText("Topic持久化发送:" + i);
textMessage.setJMSMessageID(UUID.randomUUID().toString());
producer.send(textMessage);
}
}
数据库示例: