ActiveMQ Artemis JMS客户端卡在LargeMessageControllerImpl.waitCompletion问题排查
结合线程栈信息(卡在LargeMessageControllerImpl.waitCompletion)、场景特征(大消息+海量消息、重启后复现),可能的原因如下:
客户端与服务端版本不兼容:你使用的Core JMS客户端2.19.1远低于服务端ActiveMQ Artemis 2.39.0版本。Artemis的客户端与服务端版本建议严格匹配,跨大版本的差异可能导致大消息分片传输的协议逻辑(如分片确认、缓冲区同步)存在bug,客户端无法正确处理服务端的分片响应,进而陷入长时间等待。
客户端大消息缓冲区配置不足:处理大消息时,
LargeMessageController需要内存缓冲区暂存分片数据。如果客户端的client-large-message-buffer-size配置过小,或者JVM堆内存不足,海量大消息的分片会占满缓冲区,导致新的大消息无法写入,客户端卡在waitCompletion等待缓冲区释放。网络或服务端性能瓶颈:大消息通过分片传输,需要多次网络交互。如果网络带宽不足、存在丢包,或者服务端因海量大消息导致CPU/磁盘IO过载(比如读取存储的大消息分片速度慢),服务端无法及时发送后续分片或回复确认,客户端会持续等待分片传输完成,进入长时间
TIMED_WAITING状态。消费线程处理能力不足:Spring
DefaultMessageListenerContainer的消费线程数过少,或者消费逻辑本身处理速度慢,导致海量大消息堆积在客户端接收链路中,后续大消息的分片接收被阻塞,触发waitCompletion的等待逻辑。客户端本地大消息存储异常:Artemis客户端处理大消息时,会将超出内存缓冲区的部分写入本地临时目录(由
large-messages-directory配置)。如果该目录空间不足、权限异常,大消息无法写入本地,客户端会卡在等待写入完成的逻辑中。
内容的提问来源于stack exchange,提问作者user2005317

