【发布时间】:2016-06-24 09:48:38
【问题描述】:
我是 Camel 的新手,我尝试了解 Apache Camel 中的错误/异常处理。我想做以下事情:
- 如果路由发生异常,出于分析原因,应将原始消息移至特殊的“错误目录”。
- 如果发生任何异常,应另外记录异常消息/作为邮件发送
- 如果发生任何异常,还应将异常消息记录/附加到日志文件中
对于 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