You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:36:01