java HiveMQ KeepAlive机制在Hivemq代理或客户端中不起作用

atmip9wb  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(191)

我正在使用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秒后,我没有看到我的客户端断开连接。
请告诉我该怎么办。

ajsxfq5m

ajsxfq5m1#

你的理解是错误的,经纪人和客户的行为是正确的。
如果你调用disconnect(),那么客户端会发送一个显式的DISCONNECT包给代理,告诉它它已经离开了,所以它会关闭所有的东西。
如果客户机和代理之间的网络路径在中途中断,则保持活动,因此没有数据包可以流动。

相关问题