今天继续学习第五章,Error handling.数据库
Camel做为一个集成框架,须要与外部系统对接。外部系统的不稳定因素致使其异常处理也相对复杂些。框架
Camel将异常分为两大类:学习
一是 irrecoverable error(不可恢复),好比数据库异常不能存取了。.net
二是recoverable error(可恢复),好比与外部系统进行TCP通信时不稳定。队列
关于这两种异常的处理方式也是不同的:ip
irrecoverable error的处理方式通常是调用Exchange的两个
void setException(Throwable cause);处理异常ci
Exception getException();获取异常作用域
recoverable error的处理方式是:路由
Message msg = Exchange.getOut();
msg.setFault(true);
msg.setBody("Unknown customer");get
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。