jms - 删除正在重新传送的消息

标签 jms activemq

我设置了一个 ActiveMQ 代理和一个消费者。消费者收到一条他无法处理的消息,因为它所依赖的服务存在错误(一旦修复就可以了)。所以消息不断被重新传递(消费者重新传递)——我们使用 JMS session 。使用我们当前的配置,它将在 1 天内每 10 分钟重新发送一次。这显然会导致问题,因为没有使用其他消息。

为了解决这个问题,我通过 JMX 访问了队列并尝试删除该消息,但它不存在。我猜它缓存在消费者身上,在经纪人身上不可见。 除了重新启动应用程序之外,还有什么方法可以删除此消息吗?

是否可以配置重新传递机制,以便将此类消息(最终导致活锁)放在队列的末尾,以便可以处理其他消息?

1 天 10 分钟重新投递政策应保持不变。

最佳答案

我认为您是对的,消息卡在消费者的预取缓冲区中,我不知道有什么方法可以从那里删除它们。

我会更改您的重新传送策略以在第二次失败后发送到 DLQ,它们之间的间隔要短得多,例如 30 秒,并且我会将 DLQ 策略配置为 individualDeadLetterStrategy所以你得到一个单独的 DLQ,只包含来自这个特定队列的消息。然后在此 DLQ 上设置一个消费者,以便在满足重新处理条件时将消息移动到主队列(的末尾)(无论是在一定延迟之后,还是基于从数据库中读取一些标志值,等等)。该消费者是您实现“1 天每 10 分钟”逻辑的地方,而不是在您当前拥有的重新投递政策中。

这会将垃圾消息排除在主队列之外,这样它们就不会延迟其他消息的使用,但仍然确保它们稍后会被重新处理。它将把它们放在代理上而不是消费者的预取缓冲区中,您可以在其中查看和删除它们。

关于jms - 删除正在重新传送的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26865725/

相关文章:

java - 为什么持久订阅一次只能有一个活跃订阅者

java - 在将消息添加到 jms 队列之前如何从 ESB 向发送者发送响应

java - JBoss 和 ActiveMQ 之间挂起的 Socket.read() 线程

java - ActiveMQ:如何在使用临时队列时处理代理故障转移

java - Camel可以用Reactor代替吗,如果可以,那么如何正确完成呢?

spring - 持久订阅消费者不能同时消费超过 1 条消息吗?

jms - 如何从 weblogic JMS 队列集群环境中清除/删除消息

java - 连接Android与Activemq服务器STOMP协议(protocol)

java - 使用 activeMQ + Spring : javax. jms.InvalidClientIDException:客户端:已连接的主题中的持久订阅

jms - ActiveMQ消息分组性能