运行组件测试时遭遇Wire format协商超时问题求助
ActiveMQ连接异常:Wire format negotiation timeout 排查与解决
环境配置
- JDK 17
- jakarta.jms:jakarta.jms-api:3.1.0
- 操作系统:Windows WSL
- Docker:通过Rancher Desktop运行
activemq:latest镜像
依赖配置(build.gradle)
org.apache.activemq:activemq-client:6.1.1
配置文件
application.yml
csiReceiving: responseQueue: ${queue.csi.receiving.response} mqserver: ${queue.csi.receiving.mqserver} localQueueProtocol: tcp:// localQueueHost: 192.168.208.1 localQueuePort: 61616
application-test.yml
queue: csi: primary: endpoint: activemq destination: Queue.Request response: Queue.Reply secondary: endpoint: activemq destination: Queue.RequestGpp response: Queue.ReplyGpp receiving: response: Queue.ReplyDp mqserver: local
异常日志
2024-08-07 18:42:37.709 INFO 44320 --- [测试工作线程] [CID:] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 4.6.0 (camel-12) 已启动,耗时150ms (构建:0ms 初始化:0ms 启动:150ms) 2024-08-07 18:42:37.740 INFO 44320 --- [测试工作线程] [CID:] c.n.e.s.c.stubs.CamelContextWrapper : Camel上下文DataPower已创建 2024-08-07 18:42:37.826 INFO 44320 --- [测试工作线程] [CID:] o.a.camel.language.xpath.XPathBuilder : 创建默认XPathFactory com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl@6682c2c0 2024-08-07 18:42:37.913 INFO 44320 --- [测试工作线程] [CID:] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 4.6.0 (camel-13) 正在启动 2024-08-07 18:42:38.459 INFO 44320 --- [ActiveMQ Task-1] [CID:] o.a.a.t.failover.FailoverTransport : 已成功连接到 tcp://localhost:61616 2024-08-07 18:42:43.889 DEBUG 44320 --- [CustomerProfilePool 管家线程] [CID:] com.zaxxer.hikari.pool.HikariPool : CustomerProfilePool - 连接池统计 (总连接数=7, 活跃=0, 空闲=7, 等待=0) 2024-08-07 18:42:43.889 DEBUG 44320 --- [CustomerProfilePool 管家线程] [CID:] com.zaxxer.hikari.pool.HikariPool : CustomerProfilePool - 跳过填充连接池,当前连接数充足或正在填充中 (队列深度=0)。 2024-08-07 18:42:48.470 WARN 44320 --- [测试工作线程] [CID:] o.a.a.t.failover.FailoverTransport : 传输连接(tcp://localhost:61616)失败,尝试自动重连 java.io.IOException: Wire格式协商超时:对方未发送其Wire格式。 at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:99) at org.apache.activemq.transport.failover.FailoverTransport.oneway(FailoverTransport.java:670) at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68) at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81) at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1454) at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1548) at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:568)
排查思路与解决办法
1. 版本兼容性问题
你使用的activemq-client:6.1.1属于ActiveMQ 6.x体系,而Docker官方activemq:latest镜像默认是ActiveMQ 5.x版本(6.x已更名为Artemis,镜像为apache/activemq-artemis)。两者的Wire通信格式不兼容,直接导致协商失败。
- 解决:
- 切换客户端依赖到ActiveMQ 5.x版本,比如
org.apache.activemq:activemq-client:5.18.3(尽量和服务端版本匹配); - 或者替换Docker镜像为
apache/activemq-artemis:latest,并使用对应的Artemis客户端依赖。
- 切换客户端依赖到ActiveMQ 5.x版本,比如
2. WSL网络映射问题
日志显示客户端连接的是tcp://localhost:61616,但配置文件中指定的localQueueHost是192.168.208.1,可能存在WSL与宿主机器的端口映射错误,导致实际未连接到容器内的ActiveMQ服务。
- 解决:
- 检查Rancher Desktop的端口映射规则,确保容器61616端口已映射到WSL的61616端口;
- 修改客户端连接地址为
192.168.208.1:61616,并排查代码是否正确读取了localQueueHost和localQueuePort配置。
3. WireFormat配置不匹配
即使版本兼容,自定义的WireFormat参数也可能导致协商失败。ActiveMQ 5.x默认使用openwire格式,而6.x客户端默认格式可能不同。
- 解决:
- 如果坚持用6.x客户端连接5.x服务端,在连接URL后添加参数指定格式:
?wireFormat=openwire&wireFormat.version=10; - 检查客户端代码中是否有自定义WireFormat配置,确保与服务端参数一致。
- 如果坚持用6.x客户端连接5.x服务端,在连接URL后添加参数指定格式:
4. 服务未完全启动
日志中连接成功后过了几秒才抛出超时,可能是ActiveMQ容器还未完成初始化,客户端就发起了请求。
- 解决:
- 在测试代码中添加等待逻辑,比如轮询ActiveMQ管理端口或日志,确认服务启动完成后再执行测试;
- 查看容器日志,确认出现
ActiveMQ Broker started类的启动完成标识。
内容的提问来源于stack exchange,提问作者ERK
相关产品推荐
相关产品推荐

