Spring Boot用Spring Integration发ActiveMQ Artemis消息丢失问题咨询
问题根因分析
1. 消费者监听队列错位
你配置的消费者逻辑声明监听requests队列,但从trace日志可以明确看到启动的消费者实际绑定的是replies队列:
org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl@5d2e71f5{consumerContext=ActiveMQConsumerContext{id=0}, queueName=replies}
该消费者完全没有和requests队列建立绑定,自然收不到对应队列的消息。该问题大概率是Spring Integration上下文存在其他优先级更高的Jms监听配置、注入的ActiveMQConnectionFactory默认绑定了replies队列配置,也可能是测试环境requests队列权限不足导致绑定失败,消费者自动降级到了默认队列。
2. requests队列消息已被自动清理
ActiveMQ Artemis默认存在以下自动清理规则,匹配时会直接删除队列消息且不会抛出业务报错:
- 消息设置了过期时间(TTL),在消费者上线前就已经过期,被broker的过期清理线程删除
- 队列配置
auto-delete-messages属性为true,无消费者状态下接收的消息会被自动删除 - 你发送的消息是
durable=false的非持久化消息,broker重启后会直接清空所有非持久化消息,如果先发送消息再启动broker/消费者,消息会直接丢失
3. 消息路由规则匹配错误
你生产者发送消息指定的是ActiveMQQueue("requests"),如果broker端requests地址对应的ANYCAST/MULTICAST路由规则配置错误,或者绑定的队列不是你查看的目标requests队列,消息会被路由到其他隐藏队列或死信队列(DLQ),只查看目标队列自然查不到对应消息。
排查步骤
- 登录Artemis管理控制台,查看
requests地址下绑定的所有队列列表,确认是否存在消息数不为0的其他队列,同时检查死信队列是否留存了你发送的消息 - 回溯消费者启动全量日志,排查是否存在
requests队列绑定失败的WARN/ERROR日志,大多为权限不足、队列不存在导致的绑定失败 - 临时修改生产者配置,将消息设置为持久化、TTL设为-1(永不过期),关闭消费者的情况下发送消息,查看控制台队列消息数是否正常增长,确认消息不会被自动清理
- 显式指定消费者的队列模式,避免默认配置覆盖:
.from(Jms.messageDrivenChannelAdapter(connectionFactory) .destination(new ActiveMQQueue("requests")) .pubSubDomain(false))
内容的提问来源于stack exchange,提问作者Amira Az
相关产品推荐
相关产品推荐

