2013-09-25 37 views
1

我:MQTT客户机泛美卫生组织密切的问题(JAVA)

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呼叫
  • 在(2),2级的线程MQTT: MQTT SND和MQTT呼叫
  • 进一步秒只有1个线程之后 MQTT CALL

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

+0

你有mqtt多线程的完整代码吗? – PathuZ

回答

0

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

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

,因此可以确保连接真正完成。

1

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