2011-03-08 143 views
1

我正在使用IA92 Java implementation for MQTT,它允許我連接到MQTT代理。爲了建立連接,我在做這樣的事情:如何設置MQTT客戶端的超時時間?

// Create connection spec 
String mqttConnSpec = "tcp://[email protected]_port"; 
// Create the client and connect 
mqttClient = MqttClient.createMqttClient(mqttConnSpec, null); 
mqttClient.connect("the_id", true, 666); 

的問題是,有時服務器需要太多的時間來發送響應,它拋出一個超時異常:

org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocket(OSNetworkSystem.java:130) 
    at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:246) 
    at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533) 
    at java.net.Socket.connect(Socket.java:1055) 
    at com.ibm.mqtt.j2se.MqttJava14NetSocket.<init>((null):-1) 
    at com.ibm.mqtt.j2se.MqttJavaNetSocket.setConnection((null):-1) 
    at com.ibm.mqtt.Mqtt.tcpipConnect((null):-1) 
    at com.ibm.mqtt.MqttBaseClient.doConnect((null):-1) 
    at com.ibm.mqtt.MqttBaseClient.connect((null):-1) 
    at com.ibm.mqtt.MqttClient.connect((null):-1) 
    at com.ibm.mqtt.MqttClient.connect((null):-1) 

我需要做的是手動設置超時,而不是讓mqtt客戶端決定。該文檔說:也有設置MQ遙測傳輸連接屬性的方法,例如超時和重試。

但是,老實說,我還沒有發現任何關於它的事情。我看了整個javadoc參考,沒有超時配置的證據。由於它不是開源的,我看不到源代碼。

那麼如何設置Mqtt連接的超時時間?

回答

0

我對ia92毫無所知,但我可以想象connect()調用中的666是您想要設置超時的內容嗎?

文檔所指的超時時間可能是存活超時。這是服務器和客戶端之間沒有通信時可以經過的最大秒數(由客戶端選擇)。我認爲這是你最感興趣的內容。

另一方面,重試最有可能是指在發送QoS> 0的消息時似乎已經誤入歧途的消息的重試。儘管這將由客戶端庫代碼處理,而不是經紀人。這只是在你連接之後纔會發揮作用,所以我非常懷疑這是你的問題。

爲了確保Keepalive超時設置正確,我會嘗試將您的客戶端指向修改的mosquitto代理。您可以修改src/read_handle_server.c中的mqtt3_handle_connect()以在連接時打印出存活值。這將確保它正在做你的想法,但不會幫助我擔心的實際問題!

0

你使用什麼經紀人?真正的小型消息代理V1.1 Alpha,Mosquitto,IBM WebSphere自帶的代理?您需要在服務器配置中設置此超時值。因爲系統是這樣工作的。您可以在代理中設置保持活動狀態的值,並在間隔到期之前從客戶端發送ping命令,以便代理不關閉客戶端 - 服務器連接,並重新啓動進程。實際上,即使該時間間隔到期,服務器仍然不會關閉連接,直到「寬限期」結束。見http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect

1

如果你有困惑,你可以去MqttConnectionOptions的細節。

String userName="Ohelig"; 
    String password="Pojke"; 
    MqttClient client = new MqttClient("tcp://192.168.1.4:1883","Sending");  
    MqttConnectOptions authen = new MqttConnectOptions(); 
    authen.setKeepAliveInterval(30); 
    authen.setUserName(userName); 
    authen.setPassword(password.toCharArray()); 
    authen.setKeepAliveInterval(30); 
    authen.setConnectionTimeout(300); 

    client.connect(authen);