ActiveMQ的可靠性与Broker
ActiveMQ的可靠性
ActiveMQ的可靠性我们主要从一下三点分析
- PERSISTENT: 持久化
- Transacted: 事务
- Acknowkedge: 签收
持久化
持久化可以在创建生产者之后开启:
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
看一下DeliveryMode的源码,来了解setDeliveryMode的参数。
package javax.jms;
public interface DeliveryMode {
//非持久化
static final int NON_PERSISTENT = 1;
//持久化
static final int PERSISTENT = 2;
}
- 参数设置说明:
-
持久:当服务器宕机,消息依然存在。
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
-
非持久:当服务器宕机,消息不存在
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
-
持久的Queue
默认为持久化。持久化消息,这是队列的默认传送方式,此模式保证这些消息只被传送一次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。可以去测试一下,发布的消息,经历过MQ服务器的重启之后消息仍然存在。
可靠性的另一个重要方面是确保持久性消息传送志目标后,消息服务在向消费者传送他们之前不会丢失这些消息。
-
持久的Topic
持久订阅- 一定要先运行一次消费者,等于向MQ注册,类似于我订阅了这个主题
- 然后再运行生产者发送消息
- 此时无论消费者是否在线,都会接收到。不在线的话,下次连接的时候,会把没有收过的消息都接收下来。
需要生产者设置持久化:
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
消费者创建订阅:
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "remark...");
客户端首先向MQ注册以恶搞自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,当客户端再次连接到MQ时会根据消费者的ID得到所有当自己处于离线时发送到主题的消息。
非持久订阅状态下,不能恢复或重新派送一个未签收的消息。
持久订阅才能恢复或者重新派送一个未签收的消息。
测试一下持久化订阅
public static final String ACTIVEMQ_URL = "tcp://129.*.*.*:61616";
public static final String TOPIC_NAME = "topic02";
public static void main(String[] args) throws Exception {
System.out.println("*****t2");
// 创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 创建连接Connection
Connection connection = connectionFactory.createConnection();
connection