我是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
内捕获异常消息吗?我没有找到任何可以帮助我的提示,有没有人有解决方案?
我不想以不同的方式捕获所有Exeception,我希望为所有类型的异常做全局事务。这个原因我没有使用onException()
。 Mabye这是错的吗?
为什么我对这个问题得到减号?如果你发表评论,我可以改进我的问题。
答案 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
访问异常消息。也许这对某人也有帮助。