如何设置MQTT客户端的超时?

时间:2011-03-08 18:12:47

标签: java mqtt

我正在使用IA92 Java implementation for MQTT,它允许我连接到MQTT代理。为了建立联系,我正在做这样的事情:

// Create connection spec
String mqttConnSpec = "tcp://the_server@the_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连接的超时?

3 个答案:

答案 0 :(得分:2)

如果您有困惑,可以访问MqttConnectionOptions了解详细信息。

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

    client.connect(authen);

答案 1 :(得分:0)

我对ia92一无所知,但我认为connect()调用中的666是你试图设置超时的?

文档引用的超时可能是keepalive超时。这是服务器和客户端之间没有通信时可以经过的最大秒数(由客户端选择)。我认为这是你最感兴趣的。

另一方面,重试最有可能是指在发送QoS> 0的消息时重试似乎误入歧途的消息。这将由客户端库代码处理,而不是代理。这是在你连接之后才发挥作用的,所以我非常怀疑这是你的问题。

为了确保正确设置了keepalive超时,我尝试将客户端指向修改后的mosquitto代理。您可以修改src / read_handle_server.c中的mqtt3_handle_connect()以在连接时打印出keepalive值。这将确保它按照您的想法行事,但不会对我担心的实际问题有所帮助!

答案 2 :(得分:0)

你使用什么经纪人?非常小的Message Broker V1.1 Alpha,Mosquitto,IBM WebSphere附带的代理?您需要在服务器配置中设置此超时值。因为系统以这种方式工作。您在代理中设置保持活动值并在该间隔到期之前从客户端发送ping,以便代理不关闭客户端 - 服务器连接,并且该进程将重新启动。实际上,即使该间隔到期,服务器仍然不会关闭连接,直到“宽限期”结束。见http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect