【问题标题】:Multiple error handler in camel骆驼中的多个错误处理程序
【发布时间】:2016-06-24 09:48:38
【问题描述】:

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

  1. 如果路由发生异常,出于分析原因,应将原始消息移至特殊的“错误目录”。
  2. 如果发生任何异常,应另外记录异常消息/作为邮件发送
  3. 如果发生任何异常,还应将异常消息记录/附加到日志文件中

对于 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 中捕获异常消息吗?我没有找到任何可以帮助我的提示,有没有人可以解决?

我不想以不同的方式显式捕获所有异常,我想针对所有类型的异常做所有全局的事情。因为这个我没有使用onException()。也许这是错误的?

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

【问题讨论】:

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


    【解决方案1】:

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

    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 访问异常消息。也许这也会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-27
      • 2014-02-11
      • 1970-01-01
      • 2013-03-23
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多