如何为MQTT客户端设置超时时间?

4

我正在使用IA92 Java实现的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 Telemetry Transport连接的属性,如超时和重试。但是,实际上,我没有找到任何相关内容。我已经查看了整个javadoc参考,并没有超时配置的证据。由于它不是开源的,所以我无法查看源代码。
那么,我该如何为Mqtt连接设置超时时间呢?
3个回答

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);

paho mqtt客户端配置的有效答案。 - David Renner

0
你使用哪个代理?是Really Small Message Broker V1.1 Alpha,Mosquitto,还是IBM WebSphere附带的代理?你需要在服务器配置中设置此超时值。因为系统是这样工作的。你在代理中设置一个保持活动状态的值,并在该间隔到期之前从客户端发送一个ping,以便代理不会关闭客户端-服务器连接,进而重新启动进程。实际上,即使该间隔到期,服务器仍然不会关闭连接,直到“宽限期”结束。请参见http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect

0

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

文档中提到的超时时间可能是指保持连接的超时时间。这是客户端选择的最长时间(以秒为单位),在此期间服务器和客户端之间没有通信。我认为这是你最感兴趣的。

另一方面,重试很可能是指在使用QoS>0发送消息时似乎已经丢失的消息的重试。这将由客户端库代码处理,而不是代理程序。这只有在连接后才会发挥作用,因此我非常怀疑这是你的问题。

为确保正确设置了保持连接的超时时间,我建议将客户端指向修改过的mosquitto代理程序。您可以在src/read_handle_server.c中修改mqtt3_handle_connect()以在连接时打印出保持连接值。这将确保它正在执行您想要的操作,但恐怕无法解决实际问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接