如何在ActiveMQ broker重启后持久化留存retained消息?
ActiveMQ MQTT 保留消息重启丢失问题解答
1. 现象是否为预期行为
默认配置下属于预期行为。ActiveMQ 5.15.x版本对MQTT协议的保留消息(retained message)默认仅存储在Broker内存中,不会写入KahaDB持久化存储,因此Broker重启后保留消息会被清空。
2. 实现重启后保留消息持久化的操作方案
你已完成conf/、data/目录的本地挂载,仅需按以下步骤修改配置即可:
步骤1:修改MQTT传输连接器配置
编辑本地挂载的conf/activemq.xml文件,找到<transportConnectors>节点下的MQTT连接器配置,新增persistentRetained="true"参数:
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600&persistentRetained=true"/>
如果原有配置中没有MQTT连接器,直接将上述代码添加到<transportConnectors>节点内部即可。
步骤2:确认发布端参数符合要求
你当前使用的QoS 1、retained message = true的发布参数已经满足要求:MQTT QoS ≥1的消息在ActiveMQ中默认会标记为持久化属性,可正常写入KahaDB。
步骤3:重启容器生效
保存配置后重启ActiveMQ容器,后续新发布的保留消息就会持久化到KahaDB中,Broker重启后不会丢失,晚订阅的客户端可正常获取到最新的保留消息。
注意事项
- 该配置仅对修改后新发布的保留消息生效,修改配置前已发布的保留消息仅存储在内存中,重启后仍会丢失,需重新发布一次才能完成持久化。
- 请确认本地挂载的
data/目录权限配置正确,容器运行进程拥有该目录的读写权限,避免KahaDB持久化失败。
内容的提问来源于stack exchange,提问作者ThatChrisGuy
相关产品推荐
相关产品推荐

