Mqtt客户端Paho关闭问题(Java)

时间:2013-09-25 12:53:27

标签: java multithreading mqtt

我有:

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

现在我正在使用Monitoring Console,我看到了:

  • 在(1)中,3 Mqtt线程: MQTT REC,MQTT SND和MQTT Call
  • 在(2)中,2个Mqtt线程: MQTT SND和MQTT调用
  • 进一步秒后只有1个线程 MQTT CALL

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

2 个答案:

答案 0 :(得分:2)

在调用close()方法之前确保asyncclient已断开连接,否则异步的thred将永远阻塞。你可以像这样处理(和@ 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();
}

答案 1 :(得分:0)

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

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

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