ActiveMQ 5.15的KahaDB中两类MQTT QoS1消息的物理删除时机问询
ActiveMQ 5.15 KahaDB中MQTT QoS1消息的物理删除时机
示例01场景(无消费者的未出队QoS1消息)
该消息的物理删除触发时机分两种情况:
- 若消息设置了
timeToLive(存活时间):消息过期后,Broker会将其标记为待清理状态,KahaDB的后台清理线程(默认定期执行)运行时,会物理删除这条无消费者引用的过期消息。 - 若消息未设置存活时间且Broker无全局过期配置:
- 手动通过Broker控制台、JMX工具执行消息删除操作;
- Broker重启时,KahaDB执行日志整理(cleanup)流程,移除无引用的未消费消息;
- 配置了KahaDB定期清理策略,触发时清理这类滞压的无消费者消息。
示例02场景(有消费者但未确认的未出队QoS1消息)
该消息会在以下任一条件满足时被物理删除:
- 消费者最终发送消息确认(ACK),Broker标记消息为已处理后,由KahaDB后台清理线程物理删除;
- 消费者连接断开且未重新连接(非持久化订阅场景),Broker移除该消息的消费者引用,随后清理线程删除消息;
- 消息达到自身
timeToLive过期时间,无论消费者状态如何,过期后被清理线程物理删除; - 手动通过控制台、JMX等工具删除该消息;
- Broker重启后,若非持久化订阅的消费者未恢复会话,Broker清理该未确认消息;若是持久化订阅,消息会保留到消费者重新连接确认,或消息过期后被清理。
内容的提问来源于stack exchange,提问作者Rafael Pimenta
相关产品推荐
相关产品推荐

