当前位置: 首页 > 知识库问答 >
问题:

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

王才英
2023-03-14

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

A) 我只想在相应的异常发生时将消息推入DLQ。目前,根据我的理解,在指定重试参数后,从MessageListeners抛出的任何异常都会移动到DLQ。ActiveMQ是否提供此功能以及如何提供?

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

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

我试图限制重试尝试时,JMSRe,是真。但是这个消息,虽然异常只抛出一次重试,它没有添加到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>

共有2个答案

公西姚石
2023-03-14

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

刘俊语
2023-03-14

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

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

 类似资料:
  • 问题内容: 我一直在尝试了解如何生成动态Flask URL。我已经阅读了文档和一些示例,但无法弄清楚为什么此代码不起作用: 我希望将index.html模板提供给,但事实并非如此。我收到一个构建错误。我想念什么? 如果我使用固定路径(如),则一切正常。 问题答案: 你已经拥有了很多东西。你需要做的就是使用语法(或适当的语法)修饰视图函数。 当Flask像你尝试使用的那样从动态路由的URL中提取变量

  • 我正在尝试从文件中添加路由,但我事先不知道实际参数,因此我需要有一个通过处理参数的通用函数。 要添加路线,我使用,如下所示: 以上工作正常。 但是enrty path参数不是固定的,我需要从文件中读取它们,为了实现这一点,我正在尝试这样的事情: 但它抛出此错误: FastAPI尝试在<code>foo</code>签名中查找不存在的实际参数<code>xyz</code>。 FastAPI中有什么

  • 在Swoole::$php->runMVC() 调用之前可以修改默认的路由函数。 Swoole::$php->router(function(){ return array('controller' => 'YourController', 'view' => 'YourView'); }); Swoole::$php->runMVC(); 设置后将使用制定的函数作为路由,路由函数务必要

  • phpGrace 追求极致的效率,我们并不认同在url的基础上继续进行复杂的正则匹配是一种高效的、明智的选择!方便的调用规则比不上轻快的效率!所以我们并不建议您使用复杂的路由规则!尽管如此为了满足开发者的需求和习惯我们还是开放了简单路由!在入口页开启路由配置 <?php define('PG_ROUTE', true);//在框架核心文件引用前定义 include 'phpGrace/phpGra

  • 这里是Java 8/Camel 2.19.x/AMQ 5.15.x。 我有一个Java应用程序,它使用Camel来使用AMQ队列中的消息,处理这些消息,并处理这些消息。有时路由的输出是将处理结果备份到另一个队列中,以供进一步的下游处理,但并不总是/必须。典型的Java/CAMEL/AMQ设置。 我的每条路由(我使用的是Camel XML DSL)都有一个配置的处理程序,通常如下所示: 非常简单:记

  • 我正在尝试使用Spring Boot 1.5.2.Release+Camel(Spring Boot starter)2.19.2来监听ActiveMQ队列,然后将消息发布到restendpointURL(post方法)作为其主体。实现这一目标的最佳途径是什么?我收集了一些信息,并试图将其联系在一起,但却有点困惑。 以下是我为Camel Rest DSL收集的内容,我不太确定下面的Camel是通过