camel中的多个错误处理程序

时间:2016-06-24 09:48:38

标签: java error-handling exception-handling routing apache-camel

我是Camel的新手,我尝试了解Apache Camel中的错误/异常处理。我想做以下事情:

  1. 如果路由上发生任何异常,则应将原始消息移动到特殊的"错误目录"出于分析原因。
  2. 如果发生任何异常,则另外应记录异常消息/作为邮件发送
  3. 如果发生任何异常,另外应将异常消息记录/附加到记录文件
  4. 对于1.我使用了DeadLetterChannel并将消息保存到文件夹中。这很好。

    对于2.和3.我想使用LoggingErrorHandler将错误异常移动到直接路由,在那里我发送邮件并附加一个日志文件。但2.和3.不起作用,我进入log4j文件:

      

    "错误交付失败(MessageId:[...]"

    这是我的路由代码:

    public void configure() {
        errorHandler(deadLetterChannel("direct:moveFailedMessage").useOriginalMessage());
        from("direct:moveFailedMessage").to(ftpErrorURI+ftpOptions); 
        //.to(sendMailURI); => this mail works, but here is orig. msg context
    
        from("sql:select * from v_myView?dataSource=myDataSource")
        .bean("orderSqlToJms")
        .to(jmsURI+"?JmsMessageType=Object")
        .bean("validate")
        // this error handler don't work as i expect 
        .errorHandler(loggingErrorHandler("direct:logExceptionToMailAndFile"))
        .to(ftpOutURI+ftpOptions);
    
        from("direct:logExceptionToMailAndFile").to(sendMailURI).to(ftpErrorLogURI+ftpErrorOptions);
    }
    

    当我在DeadLetterChannel上下文中尝试时,邮件发送在generell中工作,但在LoggingErrorHandler上下文中没有任何作用。此处理程序是否仅限于log4j等上下文?如果是,应该使用哪个处理程序? DefaultErrorHandler路由回发件人,这里不是TransactionErrorHandler的交易?我可以在DeadLetterChannel内捕获异常消息吗?我没有找到任何可以帮助我的提示,有没有人有解决方案?

    我不想以不同的方式捕获所有Exeception,我希望为所有类型的异常做全局事务。这个原因我没有使用onException()。 Mabye这是错的吗?

    为什么我对这个问题得到减号?如果你发表评论,我可以改进我的问题。

1 个答案:

答案 0 :(得分:0)

以下是适合我的解决方案:

errorHandler(deadLetterChannel("direct:moveFailedMessage").useOriginalMessage());
from("direct:moveFailedMessage").to(ftpErrorURI+ftpOptions).process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
        exchange.getIn().setBody(cause.getMessage());
    }
}).to(sendMailURI).to(ftpErrorLogURI+ftpErrorOptions);

我使用原始邮件将所有内容路由到deadLetterChannel。首先,我将抛出异常的原始消息写入文件。之后,我在处理器中提取异常消息,并用异常消息替换原始消息,然后将其路由到邮件和日志文件。

我的问题是,我不知道,我可以使用Exchange.EXCEPTION_CAUGHT访问异常消息。也许这对某人也有帮助。