我有一个ActiveMQ代理和一个消费者的设置。消费者得到一条他无法处理的消息,因为它所依赖的服务有一个错误(一旦修复就没问题)。因此,消息不断被重新传递(消费者重新传递) - 我们使用JMS会话。根据我们目前的配置,它将每隔10分钟重新投放一次,持续1天。这显然会导致问题,因为没有消耗其他消息。
为了解决这个问题,我已经通过JMX访问了队列并试图删除该消息,但它不在那里。我猜它是缓存在消费者身上而不是在经纪人看来。 除了重新启动应用程序之外,有没有办法删除此消息?
是否可以配置重新传递机制,以便将此类消息(最终导致实时锁定)放在队列末尾,以便处理其他消息?
1天还款政策的10分钟应保持原样。
答案 0 :(得分:2)
我认为您是正确的,消息会卡在消费者的预取缓冲区中,我不知道从那里删除它们的方法。
我将更改您的重新传递策略更改为在第二次失败后发送到DLQ,它们之间的间隔要短得多,例如30秒,我将DLQ策略配置为{{1}所以你得到一个单独的DLQ,只包含来自这个特定队列的消息。然后在此DLQ上设置一个使用者,以便在满足您的重新处理条件时将消息移动到主队列的(结束)(无论是在某个延迟之后,还是基于从数据库读取某个标志值,管他呢)。这个消费者是你实施的地方"每10分钟一次"逻辑,而不是您目前拥有它的重新交付政策。
这会将垃圾邮件排除在主队列之外,这样他们就不会延迟其他邮件的消费,但仍然可以确保稍后对它们进行重新处理。它会将它们放在代理而不是消费者的预取缓冲区中,您可以在其中查看和删除它们。
答案 1 :(得分:1)
将它放到队列后面的唯一方法是将其重现到队列中。重新传递策略只能配置到连接工厂的目标位置。
鉴于您已经建立了连接,因此创建一个可以将给定消息移动到DLQ或者在遇到该特定错误时将其生成回队列的生产者应该很难。
答案 2 :(得分:1)
在连接工厂上设置jms.nonBlockingRedelivery = true解决了问题。现在,即使有重新传递的消息,它也不会阻止处理其他消息。