Spring、JMS 和 IBM MQ:配置重试的正确方法?

问题描述 投票:0回答:1

我们在做什么?

我们使用

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-boot jms ibm-mq
1个回答
0
投票

为了对重试持续时间进行一些控制,我将 Spring

@Retryable
属性添加到
@JMSListener
所在的同一方法中。在队列本身中,我将“回退阈值”设置为 1,并定义了一个“回退队列”,用于在超过阈值时将消息发送到其中。

要捕获重试逻辑 should 触发的代码异常,请确保

@Recover
方法抛出
JmsException
RuntimeException
或从这两个继承的类似异常。

要捕获重试逻辑不应该触发的代码异常,请确保

@Recover
方法记录并吞掉异常。 请勿再次扔掉。

使用此解决方案,

@Retryable
属性控制重试逻辑。 队列的回退阈值负责在重试逻辑失败后移动消息......仅此而已。

请注意,我是一名 IBM MQ 和 JMS 新手,因此,如果此解决方案不是一个好的解决方案,请告知为什么它不是一个好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.