Camel之AsyncProcessor,asyncprocessor

來源:互聯網
上載者:User

Camel之AsyncProcessor,asyncprocessor
   Camel支援一種更複雜的非同步處理模型,非同步處理器實現一個繼承自Processor介面的AsyncProcessor介面,使用非同步Processor的優點:
a.非同步Processor不會因等待阻塞調用而耗盡線程,這樣在處理同樣工作量的情況下,通過減少線程的數量可以增加系統的伸縮性
b.使用非同步Processor,可以將路由分階段處理,不同的線程池處理其相應的路由階段,這就意味著路由可以平行處理。
缺點:實現非同步Processor要比同步的Processor複雜得多。

非同步Processor與同步Processor的區別:
a.必須提供一個AsyncCallback對象,該對象在exchange處理完成後被通知
b.在非同步Processor處理exchange的時候不能拋出任何異常,而應該將異常儲存在exchange的Exception屬性中
c.非同步Processor必須知道它將以什麼方式完成處理,非同步或同步,如果process方法返回true,則是同步完成,如果process方法返回false,則是非同步完成。
d.當處理器處理完exchange時,它必須調用callback.done(boolean sync)方法,sync參數必須與process方法的返回值一致。

對於一個路由來說,完全使用非同步模式可以降低線程的使用量,這要求從Consumer開始就必須使用非同步處理API(即調用非同步
process方法),如果Consumer調用的是同步process()方法,那麼消費者線程在處理Exchange時將被強制阻塞。
有一點必須注意的是當你調用了非同步API,這並不意味著處理過程就是非同步,這僅僅是為不捆綁在調用者線程提供了可能。

至於是否是進行非同步處理依賴於Camel路由的配置.

以上是Camel官方對非同步Processor的解釋,下面是本人用於測試的一個例子:

public static void main(String[] args) throws Exception {RouteBuilder builder = new RouteBuilder() {@Overridepublic void configure() throws Exception {RouteDefinition definition1 = this.from("file:H:/temp/in");RouteDefinition definition2 = definition1.process(new Processor() {@Overridepublic void process(Exchange exchange) throws Exception {System.out.println(Thread.currentThread().getName());System.out.println("process1");}}).process(new AsyncProcessor() {@Overridepublic void process(Exchange exchange) throws Exception {System.out.println("process");}@Overridepublic boolean process(Exchange exchange, AsyncCallback callback) {System.out.println(Thread.currentThread().getName());System.out.println("async process");try {Thread.sleep(10 * 1000);} catch (InterruptedException e) {e.printStackTrace();}callback.done(false);return false;}}).process(new Processor() {@Overridepublic void process(Exchange exchange) throws Exception {System.out.println(Thread.currentThread().getName());System.out.println("process2");}});definition2.to("file:H:/temp/out");}};DefaultCamelContext camelContext = new DefaultCamelContext();camelContext.addRoutes(builder);camelContext.start();Object object = new Object();synchronized (object) {object.wait();}}

當我看到非同步兩個字時,直覺就是使用非同步Processor時會啟用新的線程進行處理,但在上面的例子中,三個線程名稱是一樣的,
並且在阻塞了10秒後process2才列印出來,這說明上面的三個processor是在同一個線程中執行的,這也是阻塞10秒的原因。

我個人認為是對Camel非同步Processor的"非同步"兩字理解出現了偏差,這裡的非同步只為processor的processor方法,提供一個
回呼函數,而不是另啟線程。而且我們自己寫Processor處理器對這個非同步使用也很有限,因為我們寫的處理器是被調用者,AsyncCallback是由上層提供的,我們只是能調用其done方法通知上層本次處理完成,而我們更多的需求應該是自己去註冊回呼函數,並且我們能夠控制這個回呼函數的回調時機,而現在我們無法提供回呼函數的註冊。那我們不禁要問,這個AsyncCallback對象那到底是誰提供的呢?AsyncCallback對象的源頭當然是在消費者類提供的,對上面的例子來說是在FileConsumer類中,如下是GenericFileConsumer的processExchange方法的一個片段(FileConsumer繼承自GenericFileConsumer)

getAsyncProcessor().process(exchange, new AsyncCallback() {public void done(boolean doneSync) {// noopif (log.isTraceEnabled()) {log.trace("Done processing file: {} {}", target, doneSync ? "synchronously" : "asynchronously");}}});

這時建立的AsyncCallback對象就是源始的回調對象,當然在路由執行的後續過程中,該回調對象可以被封裝,其中CamelInternalProcessor的process(Exchange exchange, AsyncCallback callback)方法就是一個例子:
callback = new InternalCallback(states, exchange, callback);
這裡我們不禁又會問,既然CamelInternalProcessor能夠對源始AsyncCallback對象進行封裝加入自己的回調邏輯,為什麼我們自己不行呢,其原來還是我們寫的Processor是被調用者,是被封裝者,具體過程可參看Camel路由啟動過程。

如果非要添加自己的回調邏輯也不是不可能,就只能自己寫消費者,自己寫消費者就能控制源AsyncCallback對象,其後續只是對
源AsyncCallback對象的一個封裝的過程,只要保證最外層的AsyncCallback對象被調用,那麼源AsyncCallback對象也一定會被調用。所以在上例中,如果在第二個Processor中如果不執行callback.done(false);的話路由過程將永遠不會結束,因為上層一直認為下層處理還未結束。當然如果我們不寫異常Processor,路由過程還是會正常結束的,Camel內部會自行處理,但是如果我們寫了非同步Processor就一定要調用callback.done方法。

所以這麼一通下來,並沒有感受到官方提及的不阻塞調用、降價線程使用、路由分階段處理等,個人的感覺就是多了一個回調方法,而且這個回調功能還很有限,當然這也有可能是自己什麼地方理解錯了,如若如此,盡請指正......


美國駱駝與駱駝camel有什不同

百度搜尋美國駱駝或者德國駱駝,百科裡面會有比較詳細的介紹,我之前在一家店裡買過,上面也有一些文字說明。這樣比較清楚。
駱駝現在國內有二三十款這個稱呼的品牌。不過,現在買的多的就是美國駱駝與德國駱駝動感camel active。一個是在美國註冊,然後回來加工生產(只能算國產品牌),另一個是真正國際品牌。
參考資料:zhenwg.taobao.com
 
camel是什牌子的香煙,告訴我好?

駱駝
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.