ActiveMQ Artemis连接异常排查:已配置端口仍报错
ActiveMQ Artemis 三类异常排查与解决方案
1. 消息因重发超限转入死信队列(DLQ)
原因分析
消息多次重试投递失败(默认超过10次),Artemis会自动将这类无法正常投递的消息转入DLQ,避免无限重试消耗系统资源。常见触发场景:
- 消费者持续无响应、崩溃或未正确订阅队列
- 消息本身存在格式问题(序列化/反序列化失败)
- 队列资源不足(内存/磁盘阈值触发限流)
解决方案
- 调整重发策略:在
broker.xml的address-settings节点里修改max-delivery-attempts值,按需提高重试次数:<address-setting match="#"> <max-delivery-attempts>20</max-delivery-attempts> <!-- 其他配置保持不变 --> </address-setting> - 排查投递失败根因:通过Artemis控制台或CLI工具查看DLQ内的消息内容,定位具体问题:
./artemis queue browse --name DLQ - 处理DLQ消息:根据业务需求选择重新投递或删除:
# 将指定消息从DLQ移回原队列 ./artemis queue move --source DLQ --target your-target-queue --message-id 123456
2. MQTT/STOMP客户端报「AMQ224096: protocol CORE not found」
原因分析
虽然配置了对应协议的acceptor,但客户端连接时未指定正确协议,或者acceptor配置存在参数错误(比如协议名称写错、端口冲突),导致服务器无法匹配到对应协议的处理逻辑。
解决方案
- 验证acceptor配置:检查
broker.xml的acceptors节点,确保MQTT/STOMP的协议参数正确:
注意:如果是共用acceptor(比如同时支持CORE/MQTT/STOMP),需在<acceptors> <!-- 单独的MQTT acceptor --> <acceptor name="mqtt">tcp://0.0.0.0:1883?protocols=MQTT;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576</acceptor> <!-- 单独的STOMP acceptor --> <acceptor name="stomp">tcp://0.0.0.0:61613?protocols=STOMP;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576</acceptor> </acceptors>protocols参数里包含所有需要的协议,避免遗漏。 - 检查客户端连接参数:确认MQTT客户端使用MQTT协议版本(3.1/3.1.1/5.0),STOMP客户端明确指定STOMP协议,不要错误配置为CORE协议。比如MQTT客户端的连接URL应为
tcp://your-broker-ip:1883,并设置对应的MQTT协议参数。 - 排查端口占用:用命令检查端口是否被其他进程抢占:
netstat -tulpn | grep -E "1883|61613"
3. 连接重置(Connection reset)错误
原因分析
多由网络层面问题或连接超时配置不合理导致:
- 防火墙自动断开空闲连接
- 客户端异常退出未主动关闭连接
- 服务器与客户端的TCP参数不匹配(比如超时时间、缓冲区大小)
- 服务器资源不足(内存/磁盘耗尽)触发连接断开
解决方案
- 优化网络与防火墙配置:
- 确认客户端(172.16.8.100)与服务器之间的端口双向连通
- 调整防火墙的空闲会话超时时间,或在acceptor配置中启用TCP保活:
<acceptor name="mqtt">tcp://0.0.0.0:1883?protocols=MQTT;tcpKeepAlive=true;tcpKeepIdle=300000;tcpKeepInterval=60000</acceptor>
- 调整连接超时设置:在
broker.xml中设置合理的连接存活时间,避免服务器过早断开连接:<address-setting match="#"> <connection-ttl>600000</connection-ttl> <!-- 10分钟 --> <connection-ttl-check-interval>300000</connection-ttl-check-interval> <!-- 5分钟检查一次 --> </address-setting> - 排查客户端异常:确认客户端在退出时主动调用断开连接方法,避免遗留无效连接;同时检查客户端的TCP缓冲区大小是否与服务器端匹配。
- 查看详细日志:在
artemis.log中查找连接重置的堆栈信息,定位是客户端还是服务器端触发的断开,是否存在关联的资源不足异常。
内容的提问来源于stack exchange,提问作者Albaasith
相关产品推荐
相关产品推荐

