java - MQTT、Paho、IMqttAsyncClient、连接重试
问题描述
请就 Java 中的 IMqttAsyncClient 进行连接管理和重试提供建议
我看到连接选项包括自动重新连接,它在同步客户端中仅在建立初始连接时才起作用。
我没有看到关于 IMqttAsyncClient 行为的明确文档是初始连接失败。我是否需要在我的代码中为初始连接添加重试逻辑?
到目前为止,当我尝试按预期连接时,似乎会触发失败回调。但那我该怎么办?我是否需要自己编写一些重试逻辑?在后面的自动重新连接方案中,会发生重试。乍一看,一旦初始连接失败,就是这样。
我在失败回调中编写了重试代码
// my original connection method, re-used below from failure
... connect(... params ...) {
attempt connection using MqttAsyncClient.connect()
}
// callback
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
// log failure here
// User Context lets me know what we're trying to do
if ( "connecting".equals(asyncActionToken.getUserContext())
&& ( ! myShutdownRequested ) ) {
// log retrying and sleep a bit here
connect(); // calling original connect method again
}
}
明确的问题
- 我有责任处理重试吗?考虑到自动尝试功能,这似乎很奇怪,但事实就是如此。
- 在哪种情况下从失败回调中调用 MqttAsyncClient.connect() 是安全的?
我没有找到关于任何一点的明确文档,并且“我试过了吗”没有涵盖第 2 点。如果存在微妙的竞争条件,任何问题都可能不会立即出现。到目前为止,它似乎工作得很好......
解决方案
推荐阅读
- json - Slick postgresql json:如何进行不区分大小写的搜索?
- java - 类和对象之间的映射
- r - 列表中最长元素的长度
- angularjs - 将 MST 时区(保存在 mysql 中的数据)日期时间转换为 IST 并显示在 angularjs 页面中
- java - 使用 websphere 8.5 和 Eclipse Luna 开发一个简单的 Java EJB 2.0 项目
- java - 页面工厂初始化不起作用返回 java.lang.IllegalStateException: Unable to load cache item in appium
- angular - 减速器自动对序列号进行升序而不是彼此排序?
- amazon-web-services - 无法按所需顺序执行嵌套模板,从而进一步回滚
- c# - Xamarin 服务和表单初始化
- php - 查询:从参数计算为 NULL 次的表中计算 id