ActiveMQ提供了可靠性传输(Reliable Delivery)来保障消息的可靠投递。
主要有以下几种实现方式:
- 设置可靠传输模式
在生产者端设置DeliveryMode.PERSISTENT
:
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
这会告知Broker按照可靠模式投递此消息。
- 持久化消息
Broker将持久化消息到磁盘,重启后仍然存在。
默认行为,保障持久化的可靠性。 - 提交事务
在生产者端提交事务:
session.commit();
暂时不会从内存删除消息,直到消费者确认。
- 设置消息 acknowledge
- AUTO_ACKNOWLEDGE: 消息消费后自动确认
- CLIENT_ACKNOWLEDGE:需要调用
message.acknowledge()
手动确认
保证消费者确认后Broker才删除消息。
- 设置重试机制
在Broker配置<redeliveryPolicy />
设置重试次数和时间间隔:
<redeliveryPolicy ... >
<maximumRedeliveries>5<maximumRedeliveries>
</redeliveryPolicy>
设置消息最大重试次数。
通过以上这些配置,可以使ActiveMQ尽量保证以下几点:
- 将消息持久化到磁盘,Broker重启后仍存在
- 在生产者提交事务前不删除消息
- 等待消费者确认后Broker才删除消息
- 如果未确认,Broker会进行重试重新投递
- 最终确保消息被成功消费