首页 > 解决方案 > java paho 库中的行为 setTimeToWait() 方法

问题描述

我使用库 paho 与 mqtt 代理连接,发送消息,几乎一切正常,但我对 setTimeToWait() 方法有问题。它不计算我在方法 setTimeToWait(2000) 或 setTimeToWait(10) 中投入了多少毫秒。我总是从发布者那里收到消息。

为什么我可以在几个小时内收到消息?如果我将等待时间设置为 2000 毫秒。我认为在 2 秒内没有来自发布者的消息后,我的订阅者无法从发布者那里获得消息,并且将返回控制权。

我究竟做错了什么?

发布者代码:

public class MqttPublishSample {

    public static void main(String[] args) throws MqttException {

        String messageString = "{\"device_status\": \"ready\"}";

        if (
                args.length == 2 ) {
            messageString = args[1];
        }


        System.out.println("== START PUBLISHER ==");
        MqttClient client = new MqttClient("tcp://localhost:1883" , MqttClient.generateClientId());
        client.connect();
        MqttMessage message = new MqttMessage();
        message.setPayload(messageString.getBytes());
        message.setQos(1);
        client.publish("/catalog", message);

        System.out.println("\tMessage '"+ messageString +"' to 'iot_data'");
        client.disconnect();

        System.out.println("== END PUBLISHER ==");

    }
}

订阅者代码:

public class MqttSuscribeSample {

    public static void main(String[] args) {

        System.out.println("== START SUBSCRIBER ==");

        try{
            MqttClient client=new MqttClient("tcp://localhost:1883", MqttClient.generateClientId());
            client.setTimeToWait(2000);
            client.setCallback( new SimpleMqttCallback() );
            client.connect();
            client.subscribe( "/catalog");
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

}

SimpleMqtt回调代码

public class SimpleMqttCallback implements MqttCallback {

    public void connectionLost(Throwable throwable) {
        System.out.println("Connection to MQTT broker lost!");
    }

    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        System.out.println("Message received:\t"+ new String(mqttMessage.getPayload()) );

    }

    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
    }
}

标签: javamqttpaho

解决方案


setTimeToWait()方法是客户端在执行特定操作时应该等待代理的响应多长时间,例如

  • 发布消息
  • 订阅
  • 连接或断开代理

这不是客户端应该等待多长时间或为现有订阅传递消息。

如果您想要这种行为,您需要运行自己的计时器,并在超时时取消订阅主题或断开与代理的连接。


推荐阅读