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

ActiveMQ Artemis消息永久停滞问题排查与解决咨询

解决ActiveMQ Artemis队列中无法清除的"Delivering"状态消息问题

你遇到的是典型的未确认投递消息滞留问题:消息被投递给消费者后,消费者在部署过程中异常终止,没来得及发送ACK确认,Artemis会把这些消息标记为"delivering"状态。由于没有存活的消费者持有这些消息的投递锁,它们会一直卡在这个状态——既无法被浏览,常规的清除操作也对它们无效,重启消费者也没法触发重新投递。

下面是有效的解决方法:

1. 控制台强制重置投递状态

  • 登录Artemis Web控制台,进入目标队列的Manage页面
  • 找到Reset Delivering Messages(部分版本叫Cancel All Deliveries)选项并执行。这个操作会把所有处于delivering状态的消息强制重置为待投递状态,之后就能正常消费或清除了。

2. 用CLI命令处理

如果控制台操作没效果,直接用Artemis的CLI工具执行命令:

# 切换到Artemis安装目录的bin文件夹
cd /path/to/artemis/bin
# 替换YOUR_QUEUE_NAME为你的队列名,执行重置命令
./artemis queue reset-delivering --name YOUR_QUEUE_NAME --url tcp://localhost:61616

执行后,这些消息会回到队列的待处理池,此时就能正常清除或者被新消费者接收。

3. 配置Broker避免后续再出现

修改broker.xml里的地址配置,让消息在消费者异常时自动回滚:

<address-setting match="YOUR_QUEUE_NAME">
  <!-- 消息投递失败后5秒重试 -->
  <redelivery-delay>5000</redelivery-delay>
  <!-- 最多重试3次,之后可以转到死信队列 -->
  <max-delivery-attempts>3</max-delivery-attempts>
  <!-- 非持久化消息也允许回滚 -->
  <deliver-to-durable-only>false</deliver-to-durable-only>
</address-setting>

另外可以设置投递超时,防止消息长期卡在delivering状态:

<consumer-window-size>0</consumer-window-size>
<transaction-timeout>300000</transaction-timeout> <!-- 5分钟超时自动释放 -->

之前你尝试的清除队列、重启消费者没用,是因为Artemis默认会保留"正在投递"状态的消息,直到消费者确认或者Broker强制重置;新启动的消费者没法获取已终止会话的投递锁,所以碰不到这些消息。

内容的提问来源于stack exchange,提问作者Frontier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:50:11