HiveMQ MQTT客户端-重新订阅有关自动重新连接的主题
我在Spring中使用HiveMQ MQTT客户机来接收MQTT消息 我的客户端配置如下所示HiveMQ MQTT客户端-重新订阅有关自动重新连接的主题,mqtt,hivemq,Mqtt,Hivemq,我在Spring中使用HiveMQ MQTT客户机来接收MQTT消息 我的客户端配置如下所示 public Mqtt3AsyncClient mqtt3Client() { var mqtt3Client = Mqtt3Client.builder() .serverHost("my.host") .sslWithDefaultConfig() .serverPort(0000) .autom
public Mqtt3AsyncClient mqtt3Client() {
var mqtt3Client = Mqtt3Client.builder()
.serverHost("my.host")
.sslWithDefaultConfig()
.serverPort(0000)
.automaticReconnectWithDefaultConfig()
.buildBlocking();
mqtt3Client.connect();
return mqtt3Client.toAsync();
}
客户机可用后,使用客户机初始化另一个Springbean。它订阅了一个主题:
@PostConstruct
public void subscribeTopic() {
mqtt3AsyncClient.subscribeWith()
.topicFilter("topicfilter")
.qos(MqttQos.AT_LEAST_ONCE)
.callback(message -> {
/*Handle message*/
})
.send()
.whenComplete((mqtt3SubAck, throwable) -> {
if (throwable != null) {
/*Logging*/
} else {
/*Logging*/
}
});
}
我多次看到,当我仍然能够使用客户端连接发送消息时,没有更多的消息被发送到我的应用程序(因此当时它是连接的)
我找不到任何关于HiveMQ MQTT客户端如何处理已配置的AutomaticConnectWithDefaultConfig()
的文档。有人能指出,我在subscribeTopic()
中创建的订阅是否已重新订阅?
我还找到了方法addSubscription()
,它可能会取代.topicFilter(..).qos(…)
部分。我也找不到任何信息表明这是否使订阅对连接丢失更具弹性
如果能提供关于这个话题的任何信息,我将不胜感激
谢谢。当前,如果代理在重新连接的确认中报告现有会话,HiveMQ MQTT客户端将仅继续接收订阅消息。这需要两件事-1)您需要在最初连接时设置cleanSession=false,2)代理需要在连接之间没有丢失会话 对于1),您可以尝试将其添加到connect:
client.connectWith().cleanSession(false).send();
2)这将取决于代理以及连接丢失的原因。如果“只是”网络中断,并且代理在后台正常运行,那么它应该可以正常工作。如果代理崩溃并重新启动,那么它将要求代理配置了持久性,并且能够在重新启动后重新建立会话
实际上,在HiveMQ MQTT客户机的github项目页面上有两个关于此问题的讨论,以及是否应该在没有找到预先存在的会话的情况下将功能添加到自动重新订阅。还有一个相关的注意事项是,即使在重新连接后没有找到会话,在连接丢失时完成的任何发布是否应该自动发布。如果您需要这些功能,可以跳到那边,加入讨论:)
最后,还可以通过在构建客户机时添加MqttClientConnectedListener手动执行重新订阅,然后客户机可以在每次自动重新连接时重新创建订阅
HTH干杯,
C感谢您提供这些见解。我将按照建议添加cleanSession标志并监视结果。使用连接的侦听器也是我一直在考虑的事情。如果我们看到更多的连接问题,我会考虑这一点,看看它是否工作得更好:)如果在会话到期和客户端重新连接时,HIVEMQ MQTT客户端的1.2.0版本现在自动恢复订阅。