Camel In Action 讀書筆記 (6)

今天繼續學習第五章,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

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

相關文章
相關標籤/搜索