我们在做什么?
我们使用
mq-jms-spring-boot-starter
和 @JMSListener
注释来实现 IBM MQ 队列的消息监听器(我们称之为:QueueA
)。
当在用
@JMSListener
注释的函数中引发异常时,当前消息会自动在连接的 QueueA
中重新排队。在 MQ 服务器上,我们配置了重试计数(3 次重试),在 3 次不成功的重试后,消息将发送到回退队列 (QueueA-BACKOUT
)。
我们的问题是什么?
基本上,我们希望使用
@JMSListener
提供的自动机制来重新排队消息,但在此之前会有延迟。
出于测试目的,我们使用 ActiveMQ。在那里,我们可以轻松地在 ConnectionFactory 中配置
initialRedeliveryDelay
/redeliveryDelay
。
为 IBM MQ 配置此类内容的等效方法是什么(使用提到的 Spring Starter)?
(
INFO:
我们还没有为侦听器实现错误处理程序,这可能是执行此类操作的正确位置吗?或者是否有一个简单的配置样式选项可以解决此问题?)
为了对重试持续时间进行一些控制,我将 Spring
@Retryable
属性添加到 @JMSListener
所在的同一方法中。在队列本身中,我将“回退阈值”设置为 1,并定义了一个“回退队列”,用于在超过阈值时将消息发送到其中。
要捕获重试逻辑 should 触发的代码异常,请确保
@Recover
方法抛出 JmsException
、RuntimeException
或从这两个继承的类似异常。
要捕获重试逻辑不应该触发的代码异常,请确保
@Recover
方法记录并吞掉异常。 请勿再次扔掉。
使用此解决方案,
@Retryable
属性控制重试逻辑。
队列的回退阈值负责在重试逻辑失败后移动消息......仅此而已。
请注意,我是一名 IBM MQ 和 JMS 新手,因此,如果此解决方案不是一个好的解决方案,请告知为什么它不是一个好的解决方案。