2011-03-08 1204 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);