5

我在一个 android 应用程序中使用 MQTT,使用 Eclipse Paho 页面上的最新 jar。

我通过在 1 的 QOS 下发送偶尔发布来手动检查连接,如果在特定超时下未交付,我断开 MQTT 并重新连接。当数据连接丢失然后重新连接时,我也强制重新连接。

问题是 disconnect 方法会挂起线程并且永远不会完成 - 即使超时为零或负超时。它应该有一个 30 秒的内部超时,但它已经过了很长时间并且永远不会完成。

MqttClient 对象需要断开连接,否则它会在后台处理数据。我现在正在做的是分离一个单独的线程来断开 MQTT,然后完全创建一个新的 MqttClient。它停止使用数据,但这是一个糟糕的解决方案,因为新线程只是挂起。

有任何想法吗?

编辑:在进一步调查中,它似乎阻止了尝试在第 70 行停止 CommsReceiver:

public void stop() throws IOException {
    synchronized (lifecycle) {
        //@TRACE 850=stopping receiver
        trace.trace(Trace.FINE,850);
        if (running) {
            running = false;
            try {
                //@TRACE 851=stop: wait on lifecycle
                trace.trace(Trace.FINE,851);
                // Wait for the thread to finish.
                lifecycle.wait(); // THREAD HANGS //
            }
            catch (InterruptedException ex) {
            }
        }
    }
}
4

2 回答 2

4

如果您使用 paho 存储库的开发分支中的代码,问题是由于 paho 客户端的稳定版本中的时间窗口。你不应该遇到这个问题,因为它在这个错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=394066中被标记为已修复,尽管它不是我发现开发分支的稳定分支可靠的。

于 2013-08-07T14:07:32.097 回答
2

这里有一个错误: https : //bugs.eclipse.org/bugs/show_bug.cgi?id=394066(可能是这个问题的OP,@Vipul的信息)。状态显示已解决,因此请查看新 JAR 何时可用于修复并使用它

于 2013-08-04T04:38:30.607 回答