【发布时间】:2012-10-31 12:42:31
【问题描述】:
我在一个 android 应用程序中使用 MQTT,使用 Eclipse Paho 页面上的最新 jar。
我通过在 QOS 为 1 下发送偶尔发布来手动检查连接,如果在特定超时下未交付,我会断开 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) {
}
}
}
}
【问题讨论】: