2017-09-10 97 views
2

我遇到了Camel 2.19.1的問題。和onCompletion具有路由範圍的處理程序。運行時是Java 8,Karaf 4.0.9。駱駝上下文是用藍圖構建的。on處理器路由範圍在路由中間觸發

我與每次onCompletion處理程序中定義3條路線:

<onCompletion mode="BeforeConsumer" parallelProcessing="false" onCompleteOnly="true" useOriginalMessage="false"> 
    <log message="<route_name> Success." loggingLevel="INFO" logName="policy-repository-adapter" /> 
</onCompletion> 

三個呼叫路由通過direct端點彼此,像這樣:

pra-soap-endpoint -> direct:xacml-policy-query -> direct:send-to-pas-endpoint 

頂級路線pra-soap-endpoint樣子這個(僞碼,很明顯):

route pra-soap-endpoint 
    process 
    log "route checkpoint 1" 
    to direct:xacml-policy-query 
    log "route checkpoint 2" 
    process 
end route 

從頂級路線和onCompletion處理程序的輸出日誌是這樣的:

route checkpoint 1 
send-to-pas-endpoint Success. 
xacml-policy-query Success. 
pra-soap-endpoint Success. 
route checkpoint 2 
send-to-pas-endpoint Success. 
xacml-policy-query Success. 
pra-soap-endpoint Success. 
send-to-pas-endpoint Success. 
xacml-policy-query Success. 
pra-soap-endpoint Success. 

注意,onCompletion處理器被解僱了多次。最重要的是,頂層路由的onCompletion處理程序在路由實際完成之前觸發(日誌語句route checkpoint 2之前的日誌語句pra-soap-endpoint Success.)。

我期待什麼是這樣的:

route checkpoint 1 
send-to-pas-endpoint Success. 
xacml-policy-query Success. 
route checkpoint 2 
pra-soap-endpoint Success. 

這是駱駝或錯誤有關onCompletion處理程序是如何工作的在我結束一個誤解?

+0

我看到3'xacml-policy-query Success.'行。難道你的路由是並行觸發的,多線程正在執行它嗎?嘗試在日誌中添加線程名稱。 –

+0

@AlessandroDaRugna,這只是我從測試客戶端發送POST。對於我發送的每個POST,我都使用相同的線程名稱和麪包屑ID來獲取日誌輸出。 – Ralf

回答

1

此行爲是正確。你在你的onCompletion定義中指定mode="BeforeConsumer",這會改變駱駝的行爲(自2.14開始)。

the docs

駱駝2.14:onCompletion已被修改,以支持同步或異步模式下運行完成的任務(使用線程池),也無論之前或之後的運行路由消費者完成了。原因是給予更多的靈活性。例如,指定在路由使用者完成之前運行同步並允許在消費者將任何響應寫回到被調用者之前修改交換。您可以使用此例如添加客戶頭,或發送到日誌記錄響應消息等

再次,在自己的部分:

onCompletion支持兩種模式
AfterConsumer - 消費者完成後運行的默認模式。
BeforeConsumer - 在消費者完成之前以及消費者向被叫方回覆響應之前運行。
AfterConsumer模式是默認模式,與早期的Camel版本具有相同的行爲。
新的BeforeConsumer模式用於在消費者將其響應寫回被調用者(如果處於InOut模式下)之前運行onCompletion。這允許onCompletion修改Exchange,例如添加特殊標題,或將Exchange記錄爲響應記錄器等。


作爲一個解決方案,既可以使用AfterConsumer模式或設置圖案作爲InOnly

+0

爲什麼要在路線中間調用onCompletion回調?對我來說這似乎並不有用。路線沒有完成,接下來有更多的處理步驟。我認爲有用的行爲是在路由的最後處理步驟之後但在將交換機發送回調用者之前觸發回調。 – Ralf

+0

@Ralf你描述的是正常的行爲。使用'BeforeConsumer'模式,您可以更改Camel如何調用onCompletion回調。文檔中提供的示例說,您可以在發送到chid路由之前添加自定義標題。 –

+0

我對'onCompletion'掛鉤的理解是,它完全關於路由(消費者)完成後的「後處理」交換。消費者模式之前/之後僅將後處理的時間點移至交換返回給路由的呼叫者之前或之後。因此,您是否可以影響主叫方收到的回覆。我對你所說的內容的理解是,'BeforeConsumer'模式允許在將Exchange發送給子路由之前對其進行按摩。但這就是幾乎每條路線所做的事情,並且與「完成」路線無關。 – Ralf