不会主动踢出客户端

目前客户端每次链接会设置clientId为当前唯一值,cleanStat是默认的true。业务场景:设备上报数据与设备心跳包可能会同时上报,心跳包上报数据,我会链接emq服务,发送数据,设备主动上报,我也会链接emq服务器发送数据,两者客户端ID一样,是不是后者会挤掉前者?目前客户端报错


这是emq的日志信息

客户端设置的会话过期间隔是0,代表网络断开立即结束,keepAlived设置的是10秒,服务端设置的是60秒。但是经常出现这种问题,如图,会话过期间隔是0,连接时间已经是一个多小时之前了,就是不会踢掉链接,服务端可有办法解决这种问题。
emqx版本是5.0.11

是的,后面的会挤掉前面的,你随便用 MQTTX客户端设置不重连模式用相同的客户端 id 试一下就能知道,挤下线是立即发生的。

客户端里面crash的报错是说这条 TCP 连接 已经不在了吧。

emqx 里面的日志除了负载有点高外,没看到与你描述相关的异常啊。

Dashboard 这个图是想说什么,我没太明白,就是好奇这个客户端 id 为什么只叫 01

抱歉,我 仔细看了 2 遍,还是没有太明白描述的具体问题是什么,能麻烦展开说说么…

dashboard这个图,01是我的设备唯一标识符,用它做的clientId,我理解的是会话过期间隔为0,心跳为60。这个客户端链接时间在19.40分左右,我截图的时间在20.50分左右,理论上应该被踢出,但是并没有,仍然显示连接。这个就是我想表达的意思,不好意思没讲清楚

奇怪了,你这个是必现的么?

我刚本地试了一下,能立即踢下线啊。


推荐你用 MQTTX,关掉自动连接试一下就能看出来。
主要就是2 次连接的 client 的 tcp端口都 不一样了,说明第二个客户端已经把第一个客户端挤下线了。

是的是的,我的意思是,假设您这个第二个链接一直保持,也没有第三个去挤掉他,如果网络连接不断开那他是会永久在线吗,有什么机制会踢下线

是的,他会永远在线。要不就自己断线,想手动踢他下线,就可以点 dashboard 边上的踢除按键,他是一个 HTTP API 来的,你也可以直接调用 HTTP API 踢除指定的客户端。

好的,感谢。客户端用的SDK一直不会断网,很烦,会考虑使用http api来解决问题的,谢谢

“MQTT Call: 200408440020” #140482185 daemon prio=5 os_prio=0 tid=0x00007f3a943a0000 nid=0x7e6e in Object.wait() [0x00007f381165d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at org.eclipse.paho.mqttv5.client.internal.CommsCallback.run(CommsCallback.java:192)
- locked <0x000000008dbd9150> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)

“MQTT Snd: 200408440020” #140481586 daemon prio=5 os_prio=0 tid=0x00007f3a9430f000 nid=0x7b9b in Object.wait() [0x00007f380f53c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at org.eclipse.paho.mqttv5.client.internal.ClientState.get(ClientState.java:833)
- locked <0x000000008dbd9180> (a java.lang.Object)
at org.eclipse.paho.mqttv5.client.internal.CommsSender.run(CommsSender.java:130)
at java.lang.Thread.run(Thread.java:748)

“MQTT Rec: 200408440020” #140480585 daemon prio=5 os_prio=0 tid=0x00007f3a943e5000 nid=0x7765 runnable [0x00007f384da1d000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:224)
at java.io.DataInputStream.readByte(DataInputStream.java:265)
at org.eclipse.paho.mqttv5.client.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:96)
at org.eclipse.paho.mqttv5.client.internal.CommsReceiver.run(CommsReceiver.java:139)
at java.lang.Thread.run(Thread.java:748)

客户端堆栈CPU异常信息,这是不是代表堵塞住了

不是堵塞, “MQTT Call” 和 “MQTT Snd” 线程: 都处于 WAITING 状态,他们没有堵塞。

占用CPU很高主要这两个线程,导致直接挂掉了