Quarkus应用MQTT断网重连后无法接收消息的解决方法
Quarkus SmallRye MQTT重连后无法接收消息的解决方法
你遇到的问题是SmallRye MQTT连接器在重连Broker后未自动重新订阅主题导致的,结合你的配置和日志,可通过以下步骤解决:
1. 调整失败策略配置
当前你设置了failure-strategy=ignore,这个配置会让连接器忽略连接失败事件,不会触发后续的重新订阅逻辑。将其改为retry:
mp.messaging.incoming.smarthome/electricity.failure-strategy=retry
retry策略会在连接恢复后自动重新执行订阅流程,确保主题订阅被重新触发。
2. 补充重连相关配置
添加以下配置项,强化重连后的订阅逻辑:
# 显式开启自动重连(默认可能已开启,但显式设置更可靠) mp.messaging.incoming.smarthome/electricity.auto-reconnect=true # 关闭clean session,让Broker保留客户端订阅信息 mp.messaging.incoming.smarthome/electricity.clean-session=false
clean-session=false:适用于MQTT 3.1.1,Broker会保留你的客户端订阅状态,重连后无需重新订阅即可接收消息;如果使用MQTT 5,可替换为session-expiry-interval=3600(设置会话过期时间,单位秒)。
3. 升级Quarkus/SmallRye版本
部分旧版本的SmallRye MQTT存在重连后不订阅的bug,升级到Quarkus 2.10及以上版本可修复这类问题。
4. 备选:手动监听连接事件触发订阅(如果配置调整无效)
如果上述配置仍未解决问题,可通过Vert.x MQTT客户端的事件监听器手动处理订阅:
@ApplicationScoped public class MqttConnectionListener { @Inject @Channel("smarthome/electricity") MqttConnector connector; void onStart(@Observes StartupEvent event) { connector.getVertxMqttClient().connectHandler(conn -> { // 连接成功后手动订阅主题 conn.subscribe("smarthome/electricity", 1, ack -> { if (ack.succeeded()) { System.out.println("重新订阅主题成功"); } }); }); } }
修改配置后,重连成功时你应该能在日志中看到类似Subscribed to topic smarthome/electricity with QoS 1的条目,此时即可正常接收消息。
内容的提问来源于stack exchange,提问作者Christoph Kronberger
相关产品推荐
相关产品推荐

