Windows环境下向Apache ActiveMQ 5发送消息出现循环异常问题
问题诱因
- 核心诱因是协议不匹配:客户端发送消息时使用的传输协议,与ActiveMQ监听端口绑定的协议不一致。错误提示中的数据类型77对应ASCII字符
M,是客户端发送的非期望协议报文被OpenWire协议解析器识别到的典型特征,常见场景包括用OpenWire客户端错连AMQP/STOMP等其他协议端口、或是用HTTP客户端请求OpenWire的61616端口。 - 循环报错是重试机制导致:单次连接失败后,Apache Camel或Spring Batch的默认重试逻辑会反复创建新连接发起请求,所以日志中会出现连续不同本地端口的连接失败记录。
- Windows系统的临时端口释放逻辑会放大该现象:异常中断的连接不会被立即回收,重试过程会持续占用新的临时端口,短时间内生成大量报错日志。
解决方案
- 核对客户端连接配置与ActiveMQ端口协议的对应关系
确认Apache Camel的ActiveMQ组件配置的连接URI,与你要使用的协议端口完全匹配:- 若使用OpenWire协议,连接端口应为61616,URI格式为
tcp://127.0.0.1:61616 - 若使用AMQP协议,连接端口应为5672,同时引入AMQP客户端依赖,不要使用OpenWire客户端连接其他协议端口
- 若使用OpenWire协议,连接端口应为61616,URI格式为
- 配置连接失败的熔断限制
在Camel路由或Spring Batch作业配置中添加重试次数上限,避免无限循环重试:
<!-- Camel路由重试配置示例,最多重试3次,间隔2秒 --> <route> <from uri="direct:sendToAmq"/> <onException> <exception>java.io.IOException</exception> <redeliveryPolicy maximumRedeliveries="3" redeliveryDelay="2000"/> </onException> <to uri="activemq:queue:targetQueue"/> </route>
- 若确实需要通过HTTP协议访问ActiveMQ,可在ActiveMQ配置的
transportConnectors节点下新增HTTP传输连接器:
<transportConnector name="http" uri="http://0.0.0.0:8080?maximumConnections=1000&wireFormat.maxFrameSize=1994857600"/>
配置完成后即可通过8080端口使用HTTP协议发送消息。
内容的提问来源于stack exchange,提问作者user1088984
相关产品推荐
相关产品推荐

