2

我有:

MqttAsyncClient mq;
   ...
   mq = new MqttAsyncClient(myServer1,"app1");
   mq.connect();
   ...
   //(1)
   //doing something with mq (pub/sub)
   ...
   mq.disconnect();
   mq.close();
   //(2)

现在我正在使用监控控制台,我看到:

  • 在(1)中,3个Mqtt线程:MQTT REC、MQTT SND和MQTT Call
  • (2)中,2个Mqtt线程:MQTT SND和MQTT Call
  • 再过几秒钟后,只有 1 个线程 MQTT CALL

CALL 线程永远不会停止。怎么来的 ?

4

2 回答 2

2

在调用 close() 方法之前确保 asyncclient 已经断开连接,否则 async 的线程将永远阻塞。你可以这样处理(与@Tom&@Mehmet Ince 一样):

IMqttToken token = mq.disconnect();

int count = 0;
while (count++<5) {
  if (token.isComplete()) {
    mq.close();
    break;
  }
  try {
    Thread.sleep(2000l);
  } cath(Exception e) {
    //TODO
  }
}

if (count > 5) {
  mq.disconnectForcibly();
  mq.close();
}
于 2017-01-24T07:58:37.870 回答
0

我认为 use 应该使用 :MqttClient client = new MqttClient...然后调用client.connect();

因为,它会调用代码:(aClient.connect(options, null, null).waitForCompletion(getTimeToWait()); 你可以查看源代码)

所以它可以确保连接真正完成。

于 2013-11-06T12:27:14.187 回答