2017-04-20 120 views
0

我试图处理使用自定义处理器的异常。我的路线建设者看起来是这样的:模仿Apache Camel DefaultErrorHandler

onException(Exception.class) 
    .maximumRedeliveries(0) 
    .process(exceptionProcessor) 
    .handled(true) 
    .to("file:C:\\Mahesh\\delete\\failedrequests"); 

我的异常处理器看起来是这样的:

public class ExceptionProcessor implements Processor 
{ 
    private static final Logger LOGGER = ExLoggerFactory.getLogger(ExceptionProcessor.class); 

    @Override 
    public void process(Exchange exchange) throws Exception 
    { 
     Exception ex = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); 
     Object messageHistroy = exchange.getProperty(Exchange.MESSAGE_HISTORY, Object.class); 

     LOGGER.error("\n\nMessage History\n---------------------------------------------------------------------------------------------------------------------------------------\n" 
        + messageHistroy 
        +"\n\nStacktrace\n---------------------------------------------------------------------------------------------------------------------------------------" 
        ); 
     ex.printStackTrace(); 
    } 
} 

正如你所看到的,上面我试图模仿DefaultErrorHandler的行为:它首先打印消息历史记录然后堆叠跟踪。

但是,我的ExceptionProcessor不像DefaultErrorHandler那样以相同的方式打印消息历史记录。 DefaultErrorHandler打印这样的:

Message History 
--------------------------------------------------------------------------------------------------------------------------------------- 
RouteId    ProcessorId   Processor                  Elapsed (ms) 
[route1   ] [route1   ] [file://C:%5CMahesh%5Cdelete%5Ccamelsource          ] [  121] 
[route1   ] [process1   ] [[email protected]               ] [  120] 
[     ] [to1    ] [file:C:\Mahesh\delete\badworkitems           ] [  98] 

而我ExceptionProcessor打印这样的:

Message History 
--------------------------------------------------------------------------------------------------------------------------------------- 
[DefaultMessageHistory[routeId=route1, node=process2], DefaultMessageHistory[routeId=null, node=process1]] 

问:看来,我的处理器是不是能够得到处理器和第三排第三列到端点。我如何得到这个。

此外,打印消息历史记录之前,也DefaultErrorHandler此打印:

o.a.camel.processor.DefaultErrorHandler : Failed delivery for (MessageId: ID-01HW865638-58603-1492677082431-0-7 on ExchangeId: ID-01HW865638-58603-1492677082431-0-8). Exhausted after delivery attempt: 1 caught: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('"' (code 34)): was expecting comma to separate OBJECT entries 
at [Source: C:\Mahesh\delete\camelsource\file1.json; line: 4, column: 3]. Processed by failure processor: FatalFallbackErrorHandler[Channel[sendTo(file://C:%5CMahesh%5Cdelete%5Cbadworkitems)]] 

问:正如你所看到的,DefaultFaultHandler还能够打印消息ID,交换ID,源文件名和发送 - 到文件夹名称。我想知道从哪里得到这些信息。对于源文件名,我尝试了所有Exchange.FILE_*属性,但全部打印为null

回答

0

只要看看骆驼源代码如何打印该信息,因为它使用了您也可以访问的消息历史记录。你可以在github上找到源代码。

https://github.com/apache/camel/