自定义异常使用 Spring JMS 路由到 ActiveMQ 中的 DLQ



我正在使用代理 activemq 5.5.1 和 Spring JMS 进行消息传递。我有以下要求

A) 我想仅在发生相应异常时才将消息推送到 DLQ 中。目前,根据我的理解,消息侦听器引发的任何异常都会在指定的重试参数后移动到 DLQ。ActiveMQ是否提供此功能以及如何提供?

B) 我必须根据类级别控制重试机制,这意味着自定义异常的不重试。例如,如果抛出了一个 MyException 类的实例,我不应该重试这些消息,这样它就不应该转到 DLQ。请告知

-----编辑-----------

我试图在JMSRedeliver为真时限制重试尝试。但是,此消息虽然异常仅引发一次重试,但它不会添加到DLQ。这是我的测试代码。我正在使用 activemq 5.5.1

 public void onMessage(Message message) {
    try {
        if (message != null)
            if (message instanceof TextMessage) {
                String messageContent = ((TextMessage) message).
                if (message.getBooleanProperty("JMSRedelivered")) {
                    throw new CustomException1();
                } else {
                    throw new CustomJMSException("Retry Logic");
                }
            }
        }
    } catch (JMSException jmsex) {
    } catch (CustomException1 e) {
        System.out.println("Exception Caught");
    } catch (CustomJMSException e) {
        throw new CustomJMSException("Exception thrown");
    }

Spring Configuration:
<bean id="redeliveryPolicy1" class="org.apache.activemq.RedeliveryPolicy">
    <property name="initialRedeliveryDelay" value="1000" />
    <property name="redeliveryDelay" value="1000" /> 
    <property name="maximumRedeliveries" value="5" />
    <property name="useExponentialBackOff" value="false" />
    <property name="backOffMultiplier" value="1" /> 
</bean>

需要做的就是捕获(并忽略或记录)要忽略的异常,并重新抛出要路由到DLQ的异常。

或者,你可以使用 spring-retry 而不是 activeMQ 的机制;它有策略来确定哪些异常应该重试,还有一个RecoveryCallback,允许你决定吸收或重新抛出哪些异常。

答案 1) 是的,ActiveMQ 具有开箱即用的功能,其中失败的消息(当然经过某些重试后)会自动移动到名为 ActiveMQ.DLQ 的队列中,这是代理中所有队列的默认死信队列