java - 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) {
}
}
解决方案
该setTimeToWait()
方法是客户端在执行特定操作时应该等待代理的响应多长时间,例如
- 发布消息
- 订阅
- 连接或断开代理
这不是客户端应该等待多长时间或为现有订阅传递消息。
如果您想要这种行为,您需要运行自己的计时器,并在超时时取消订阅主题或断开与代理的连接。
推荐阅读
- arrays - 出现错误 - 在 COBOL 中指定的下标或索引不足
- kubernetes - cert-manager challange 卡在等待`等待 http-01 质询传播:未能执行自检 GET 请求`
- html - 在不更改格式的情况下在单词周围添加边框?HTML
- visual-studio - MvvmCross pdb 调试符号未在 Visual Studio 2019 中加载
- azure-data-factory-2 - Azure 数据工厂 - 数据流 - 加入 - 广播
- swift - 有什么方法可以在 iOS 13 上的 Swift 中访问 Wifi 信号强度?
- android - 如何使用 WebResourceResponse 拦截广告 shouldInterceptRequest
- r - 在多个变量上传递函数
- python - 使用 Systemctl 找不到 Python
- python-3.x - 为什么有些表情符号没有转换回它们的表示形式?