今天继续学习第五章,Error handling.
Camel作为一个集成框架,需要与外部系统对接。外部系统的不稳定因素导致其异常处理也相对复杂些。
Camel将异常分为两大类:
一是 irrecoverable error(不可恢复),比如数据库异常不能存取了。
二是recoverable error(可恢复),比如与外部系统进行TCP通讯时不稳定。
关于这两种异常的处理方式也是不一样的:
irrecoverable error的处理方式一般是调用Exchange的两个
void setException(Throwable cause);处理异常
Exception getException();获取异常
recoverable error的处理方式是:
Message msg = Exchange.getOut();
msg.setFault(true);
msg.setBody("Unknown customer");
Camel提供了四种error handle来处理异常。
1.The default error handler
这是Camel默认的处理方式,我们不需额外添加代码。默认的设置是:不重新发起;异常会返回给调用者。
2.The dead letter channel error handler
这种处理方式是将异常的消息放入一个队列中,如下图,代码如下:
errorHandler(deadLetterChannel("log:dead?level=ERROR"));
3.The transaction error handler
这个在第9张会专门讲事物,再细说。
4.The no error handler
这个看名字就可以明白,就是禁止errorHandler.不会产生错误。
5.The logging error handler
记录产生的异常以及对应的消息。
这一节讲如何重新发起任务,代码如下:
errorHandler(defaultErrorHandler()
.maximumRedeliveries(2)
.redeliveryDelay(1000)
.retryAttemptedLogLevel(LoggingLevel.WARN));
from("file://target/orders?delay=10000")
.beanRef("orderService", "toCsv")
.to("mock:file")
.to("seda:queue.inbox");
from("seda:queue.inbox")
.errorHandler(deadLetterChannel("log:DLC")
.maximumRedeliveries(5).retryAttemptedLogLevel(LoggingLevel.INFO)
.redeliveryDelay(250).backOffMultiplier(2))
.beanRef("orderService", "validate")
.beanRef("orderService", "enrich")
.to("mock:queue.order");
关于errhandle的处理可以定义在路由前面(红色部分)他的作用域是整个上下文,也可以定义在路由中(绿色部分),他的作用域是这条路由。
关于Exception不同的exception;Camel提供了不同的exception不同的处理策略。可参考http://www.oschina.net/question/234345_51143。