2013-09-25 45 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(); 
}