我正在使用hivemq-mqtt-client-1.3.0.jar并创建一个hivemqmqtt 5客户端。我已经从客户端指定了60秒的保持活动时间。
String id = "1";
Mqtt5ClientBuilder builder = Mqtt5Client.builder()
.identifier(id)
.serverHost("localhost")
.serverPort(1883)
.addConnectedListener(context -> System.out.println("Connected Now"))
.addDisconnectedListener(context -> System.out.println("Disconnected Connected Now"));
client = builder.build();
client.toBlocking().connectWith().cleanStart(false).keepAlive(keepAlive).send();
subscribe(id, "1");
一旦我用上面的客户端连接到hiveMq,我就会从event.txt文件中获得一个连接日志,如下所示。
第一个月
现在我断开我的客户端使用下面的代码后10秒。
Thread.sleep(10*1000);
client.toBlocking().disconnect();
我的期望是,即使客户端在10秒后断开连接,代理也应该让连接再保持50秒,因为保持连接是60秒。
但是一旦我断开了客户端,我也会从代理那里得到断开消息,这意味着保持活动不起作用。
2023-01-03 12:56:49,482 - Client ID: 1, IP: 127.0.0.1 disconnected gracefully.
我还附上了下面的hivemq代理config.xml文件。
<hivemq>
<listeners>
<tcp-listener>
<port>1883</port>
<bind-address>0.0.0.0</bind-address>
</tcp-listener>
<mqtt>
<keep-alive>
<allow-unlimited>false</allow-unlimited>
<max-keep-alive>60</max-keep-alive>
</keep-alive>
</mqtt>
</listeners>
<anonymous-usage-statistics>
<enabled>true</enabled>
</anonymous-usage-statistics>
</hivemq>
请指出我在这里做错了什么,任何建议都将不胜感激。
更新******
现在我将订阅一个主题而不从我的客户端发送断开消息。请再次参考上面的代码,我添加了一个函数调用订阅主题。
public static void subscribe(String id, String cid) {
try {
client.toAsync().subscribeWith()
.topicFilter("TEMP/"+id+"/"+cid).callback(publish -> {
String message = new String(publish.getPayloadAsBytes(), StandardCharsets.UTF_8);
System.out.println("Received message on topic " + publish.getTopic() + ": " + message);
}).send();
System.out.println("Subscribing to " + "TEMP/"+id+"/"+cid);
现在在此之后,我没有收到任何关于这个主题的消息。我的保持活跃的时间是60秒,如上面的配置文件中所示,所以经纪人应该断开我的客户端后60*1.5 = 90秒。但即使在90秒后,我没有看到我的客户端断开连接。
请告诉我该怎么办。
1条答案
按热度按时间ajsxfq5m1#
你的理解是错误的,经纪人和客户的行为是正确的。
如果你调用
disconnect()
,那么客户端会发送一个显式的DISCONNECT包给代理,告诉它它已经离开了,所以它会关闭所有的东西。如果客户机和代理之间的网络路径在中途中断,则保持活动,因此没有数据包可以流动。