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