环境
- EMQX 版本:企业版本4.4.14
- 操作系统版本:ubantu 22.04.1
重现此问题的步骤
- 设备一瞬间发送20条 Qos1的数据到Mqtt
- 服务端处理一个消息就给mqtt发送一个topic为xx/xx/xx的响应消息(未使用多线程、异步处理)
预期行为
服务端接受到20条消息,依次处理完,并发送消息到mqtt。
实际行为
在处理第一个消息时,执行mqttClient.publish(topic,mqttMessage)会一直等待,最后报错:等待来自服务器的响应时超时 (32000)
已查看
1、掉线打印记录:
"reason": "tcp_closed",\n "keepalive": "undefined",\n "protoVer": "5",\n "protoName": "MQTT",\n
错误码:32000
msg: terminate
2、代码信息:
- 使用的jar为1.2.5,使用的方法是阻塞的publish,在执行publish后需要等到服务器端的回应。
- emq打印的debug级别log日志,已开启 未发现error日志,且收到了客户端发送的消息
代码为 messageArrived
中执行的阻塞publish方法
3、疑问:
java客户端发送消息后,debug日志中,收到客户端发送的消息,也响应了SEND PUBACK(Q0, R0, D0, PacketId=2, ReasonCode=16),但客户端deliveryComplete未接收到PUBACK,是否因为线程已经使用完导致无法接收到新的数据流入,然后超时?
16:No matching subscribers
设备端发送数据到EMQ:2023-05-29T20:01:56.690904+08:00 [debug] ip:3712 [MQTT] SEND PUBLISH(Q1, R0, D0, Topic=xxx/xxx/request, PacketId=2, Payload={xxx}
java客户端发送数据到EMQ:2023-05-29T20:01:57.641303+08:00 [debug] ip:3712 [MQTT] RECV PUBLISH(Q1, R0, D0, Topic=xxx/xxxx/response, PacketId=2, Payload={xxx}
EMQ发送的消息:2023-05-29T20:01:57.641726+08:00 [debug] ip:3712 [MQTT] SEND PUBACK(Q0, R0, D0, PacketId=2, ReasonCode=16)
请问这里PacketId都为2,但topic不同,为什么会响应ReasonCode=16?这里的16是否就是导致java客户端未接收到PUBACK导致超时的原因?
测试正常数据返回code也是16,那么请问下为什么在返回java客户端的deliveryComplete方法没有收到响应
初步怀疑是 EMQ返回了ACK,但是java客户端没有资源可用,导致对ACK没有处理,就阻塞了。后续的也一直在等待,没有多的资源空出,就一直等待,导致超时。
不知道对不对,望指教。
qibin
7
我也遇到这个问题,然后改成异步客户端在测试,请问问题解决了吗