Mosquitto 2.0.x:SIGHUP后持久化客户端订阅信息未生效问题
Bug处理记录
2023年10月20日经调查已修复该Bug
环境配置详情
- 发布端客户端
timeSeriesPublisher:发布Topic A消息,Clean Session设为True,消息QoS为1 - 订阅端客户端
timeSeriesSubscriber:订阅Topic A,Clean Session设为False,消息QoS为1
正常预期行为
- 当
timeSeriesSubscriber断开连接时,Mosquitto会将timeSeriesPublisher发送的所有消息存储在mosquitto.db中,等待订阅端读取 - 订阅端断开时重启broker,其订阅信息会被保留,新消息仍会被存储至
mosquitto.db中
异常现象
但重启broker后向其发送SIGHUP信号,timeSeriesPublisher发送的新消息会被确认,但订阅端重新连接后无法接收,且未存储在mosquitto.db中,不符合持久化客户端定义:
客户端连接时设置clean session标志(又称clean start),若设为false则连接为持久化,客户端断开时订阅保留,后续QoS1/2消息会被存储至其再次连接。
简化复现步骤(2023年10月20日)
使用mosquitto_sub、mosquitto_pub和Mosquitto broker执行以下步骤:
- 配置环境及文件
- 启动broker与订阅端
- 发送一条消息
- 终止订阅端
- 终止broker
- 重新启动broker
- 发送一条消息
- 向broker发送
SIGHUP信号 - 发送约4条消息
- 启动订阅端
- 终止broker与订阅端
若跳过步骤8则无异常;执行步骤8后,订阅端重新连接后无法接收预期消息,且消息未存入数据库。
内容的提问来源于stack exchange,提问作者Satya
相关产品推荐
相关产品推荐

