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

时间:2012-12-04 20:39:01

标签: logging exception-handling apache-camel apache-karaf

我有一条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>

如果我删除&#34; onException&#34;然后,在所有异常情况下,源消息都出现在死信队列中,但是没有记录。

如果我按上面的方式运行,那么异常跟踪会记录到Karaf的日志中(如果它是&#34; notificationException&#34;)但相关的源消息不会回滚到死信队列并且消失在以太中(大概是因为它认为我已经在&#34; onException&#34;结构中处理了它。)

看了不同种类的错误处理程序后,我尝试将其添加到DeadLetterChannelBuilder中,例如...

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

......但这些都不是合法的财产。

我还要告诉我,必须在onException子句中明确列出不同的异常才是正确的。

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

感谢您提供任何指导,

学家

2 个答案:

答案 0 :(得分:5)

您可以使用死信队列的路由,并进行日志记录和发送到JMS队列。然后使用direct来引用这条路线

<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>

您使用的是哪个版本的Camel?

答案 1 :(得分:2)

这是另一个记录异常并将交换发送到死信队列的选项,用Camel DSL

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

setErrorHandlerBuilder(deadLetterChannel("direct:dlq")
    .onExceptionOccurred(exceptionLoggingProcessor));