Camel:如何使用登录ErrorHandler

时间:2014-01-13 10:59:05

标签: variables logging apache-camel enterprise-integration

我已经定义了一个错误处理程序,它适用于多个路由,即

errorHandler(transactionErrorHandler() 
    .maximumRedeliveries(5) 
    .log("SOMETHING USELESS"); 

from(file1) 
    .id(route1) 
    .transacted() 
    .process(new SpecificProcessor1()); 

from(file2) 
    .id(route2) 
    .transacted() 
    .process(new SpecificProcessor2()); 

当其中一个SpecificProcessor类内发生异常时,将记录以下内容:

[10-Jan-2014 15:08:59.449] [Error] SOMETHING USELESS: Failed delivery for (MessageId: ID-BLAH BLAH). On delivery attempt: 1 caught: java.lang.Exception: cannot do whatever I'm supposed to do 

现在我想打印一些有用的东西,以帮助确定在route1或route2中是否发生了异常,即:

[10-Jan-2014 15:08:59.449] [Error] ROUTE 1: Failed delivery for (MessageId: ID-BLAH BLAH). On delivery attempt: 1 caught: java.lang.Exception: cannot do whatever I'm supposed to do 

我怎样才能做到这一点?

我尝试过像.log($ {routeId})之类的东西,但它不起作用。

非常感谢!

2 个答案:

答案 0 :(得分:0)

您可以为appender配置添加线程名称。例如log4j的%t:

<appender name="..." class="...">
....
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd/MM/yyyy HH:mm:ss,SSS} %p %t %c - %m%n" />
    </layout>
</appender>

你会看到类似的东西:

13/01/2014 12:52:33,535 INFO Camel (mainCamelContext) thread #8 - JmsConsumer[jms/customer]  .....

我想这足以识别路线

答案 1 :(得分:0)

要指定路由名称,理想情况下应使用.routeid()而不是.id() - 后者设置节点名称,而不是路由名称:

from(file1).routeId(route1)

您可以提取路由ID,您可以使用exchange.getFromRouteId(),它将返回创建交换的路由ID。如果使用直接组件嵌套路径,则可以使用工作单元,如下所示:

exchange.getUnitOfWork().getRouteContext().getRoute().getId()

不确定是否存在使用DSL检索此信息的机制。

我希望这会有所帮助。