等待来自服务器的响应时超时 (32000)

环境

  • EMQX 版本:企业版本4.4.14
  • 操作系统版本:ubantu 22.04.1

重现此问题的步骤

  1. 设备一瞬间发送20条 Qos1的数据到Mqtt
  2. 服务端处理一个消息就给mqtt发送一个topic为xx/xx/xx的响应消息(未使用多线程、异步处理)

预期行为

服务端接受到20条消息,依次处理完,并发送消息到mqtt。

实际行为

在处理第一个消息时,执行mqttClient.publish(topic,mqttMessage)会一直等待,最后报错:等待来自服务器的响应时超时 (32000)

在 emqx 上开下这个消息发布客户端的日志追踪参考:https://www.emqx.io/docs/en/v4.4/getting-started/log.html#log-trace-2

然后分析下日志确定下问题出现在哪

已查看
1、掉线打印记录:
"reason": "tcp_closed",\n "keepalive": "undefined",\n "protoVer": "5",\n "protoName": "MQTT",\n
错误码:32000
msg: terminate
2、代码信息:

  1. 使用的jar为1.2.5,使用的方法是阻塞的publish,在执行publish后需要等到服务器端的回应。
  2. 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方法没有收到响应 :joy:

初步怀疑是 EMQ返回了ACK,但是java客户端没有资源可用,导致对ACK没有处理,就阻塞了。后续的也一直在等待,没有多的资源空出,就一直等待,导致超时。
不知道对不对,望指教。