Camel In Action 读书笔记 (6)

拈花ヽ惹草 提交于 2020-02-28 21:42:28

今天继续学习第五章,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");

Error handlers in Camel

Camel提供了四种error handle来处理异常。

1.The default error handler

这是Camel默认的处理方式,我们不需额外添加代码。默认的设置是:不重新发起;异常会返回给调用者。

2.The dead letter channel error handler

这种处理方式是将异常的消息放入一个队列中,如下图,代码如下:

errorHandler(deadLetterChannel("log:dead?level=ERROR"));

image

3.The transaction error handler

这个在第9张会专门讲事物,再细说。

4.The no error handler

这个看名字就可以明白,就是禁止errorHandler.不会产生错误。

5.The logging error handler

记录产生的异常以及对应的消息。

Using error handlers with redelivery

这一节讲如何重新发起任务,代码如下:

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的处理可以定义在路由前面(红色部分)他的作用域是整个上下文,也可以定义在路由中(绿色部分),他的作用域是这条路由。

Using exception policies

关于Exception不同的exception;Camel提供了不同的exception不同的处理策略。可参考http://www.oschina.net/question/234345_51143

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!