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

记录骆驼异常并发送到死信通道

夏弘文
2023-03-14

我有一个Camel路由,在Karaf中运行,为此我添加了一个死信通道。这是为了处理路由失败的情况,我想保留问题消息并记录原因。我不能将异常抛回调用应用程序,因为我正在异步处理一些处理。

通过阅读文档和尝试大量案例,我不清楚如何将异常记录到Karaf的日志中,并将原始消息存放到死信队列中。

以下是我的摘录:-

<bean id="deadLetterQueue" class="org.apache.camel.builder.DeadLetterChannelBuilder">
    <property name="deadLetterUri" value="activemq:dead.letter.queue"/>
    <property name="redeliveryPolicy" ref="redeliveryPolicy"/>
</bean>

<bean id="redeliveryPolicy" class="org.apache.camel.processor.RedeliveryPolicy">
    <property name="maximumRedeliveries" value="1"/>
    <property name="redeliveryDelay" value="1000"/>
</bean>

<camelContext id="notification" errorHandlerRef="deadLetterQueue"
    trace="false" xmlns="http://camel.apache.org/schema/blueprint">
    <onException>
        <exception>org.xyz.exceptions.unchecked.notificationException</exception>
        <log logName="notifications" loggingLevel="ERROR"
            message="Exception from notification Camel route" />
    </onException>

    <route id="DoSomething" errorHandlerRef="deadLetterQueue">
        <from uri="activemq:notification.in" />
        <log logName="notifications" loggingLevel="TRACE"
            message="Notification route initiated" />
        <bean ref="NotificationProcessor" method="doStuff" />
    </route>
</camelContext>

如果我删除“onExcgon”结构,那么在所有异常情况下,源消息都会出现在死信队列中,但不会记录。

如果我如上所述运行它,那么异常跟踪将记录到 Karaf 的日志中(如果它是“通知异常”),但关联的源消息不会回滚到死信队列并消失在以太中(大概是因为它认为我已经在“onException”结构中处理了它)。

在查看了不同类型的错误处理程序之后,我尝试将内容添加到DeadLetterChannelBuilder中,例如...

<property name="logName" value="notifications"/>
<property name="level" value="ERROR"/>

…但这些不是合法财产。

这也让我感到震惊的是,必须在 onException 子句中明确列出不同的例外是不正确的。

那么,如何让死信通道记录异常跟踪并将消息放入队列呢?也许死信通道不是正确的处理程序——在这种情况下,我对自动重发并不感兴趣。

感谢您的指导,

J.

共有2个答案

公良安邦
2023-03-14

您可以只使用死信队列的路由,然后进行日志记录并发送到 JMS 队列。然后用直接来指代这条路线

<property name="deadLetterUri" value="direct:myDLC"/>

<route>
  <from uri="direct:myDLC"/>
  <log logName="notifications" loggingLevel="ERROR"
            message="Exception from notification Camel route" />
  <to uri="activemq:dead.letter.queue"/>
</route>

你在用什么版本的骆驼?

宦子琪
2023-03-14

这是记录异常并将交换发送到死信队列的另一种选择,以 Camel DSL 表示

Processor exceptionLoggingProcessor = (exchange) -> 
      logger.error("Error handled in camel.", exchange.getProperty(Exchange.EXCEPTION_CAUGHT));

setErrorHandlerBuilder(deadLetterChannel("direct:dlq")
    .onExceptionOccurred(exceptionLoggingProcessor));
 类似资料:
  • 我正在尝试从目录中选取一个文件,拆分一个文件,并将每一个拆分行添加到ActiveMQ中。我在这个过程中遇到了异常处理的问题。假设目录中的文件是一个二进制文件(可执行文件),那么splitter会显示org.apache.camel.runtimeCamelException和java.nio.charset.MalFormedInputException异常。如果出现这种情况,那么我需要捕获这些异

  • 我试图使用Kerberos从ActiveMQ-Camel桥向Kafka (Cloudera)发送消息。 ActiveMQ v5.15.4 骆驼:2.21.1 Kafka客户端:1.1.0 服务器版本:Apache/2.4.6(CentOS) 骆驼.xml剪刀是: 这是日志中的kafka客户端配置: 日志级别:调试 Jaas文件: 出口: 当我发送消息时,我在调试级别收到以下日志,但消息未被发送:

  • 我正在使用死信频道EIP与骆驼文件中描述的死信频道完全相同。这是我的camel.xml(删除头) 我只有一条路由具有基于内容的路由器,其实质是,如果消息体具有getInfo,则从jms:foo路由到jms:getInfo,如果消息体具有performAction,则从jms.foo路由到jms:performAction 我预计,当jms:getInfo使用者没有运行时,交付将失败,重新交付尝试将

  • 我使用deadLetterChannel来处理异常,并将它们发送到错误队列。 是否可以使用其他邮件标头来丰富邮件?还是我必须为此使用 onException?

  • 在camel spring ws中,有没有办法将自定义主体(例如自定义bean)和http状态返回为500? 我试过了 然后在processor公共类ExceptionProcessor实现processor{ } 但是即使身体是我想要的,超文本传输协议状态总是200。 你能帮我吗? 更多信息:我正在使用camel 2.20.2版

  • 无法弄清楚这是怎么回事-试图设置一个路由,只看到cxf连接到soap web服务(我不关心实际数据,也不期望数据实际“工作”,但它不断引发一个我不理解的异常: 我想知道我是否正确配置了它。我想这可能是一个丢失的jar,但当我尝试引入其他jar时,导致了依赖冲突 我正在使用maven依赖项“camel-cxf”来加载我所有的jar配置 “原因:org.apache.cxf.bus.extension