2013-07-03 48 views
0

我們使用Camel流利構建器來設置一系列複雜的路由,其中​​我們使用RecipientList功能使用動態路由。在Apache Camel中,如果端點不存在,如何接收錯誤消息?

我們遇到過在某些情況下,收件人列表包含不存在的消息傳遞端點(例如,類似於seda:notThere)的問題。

一個簡單的例子是這樣的:

from("seda:SomeSource")....to("seda:notThere"); 

我如何配置路由,這樣如果交換嘗試到不存在的端點路線,拋出一個錯誤?

我正在使用Camel 2.9.x,並且我已經嘗試使用Dead Letter Channel和各種Error Handler實現,並且(看起來)沒有記錄錯誤或警告。

唯一記錄我看到表明駱駝是(試圖)發送到不存在的端點:

2013-07-03 16:07:08,030|main|DEBUG|o.a.c.p.SendProcessor|>>>> Endpoint[seda://notThere] Exchange[Message: [email protected]] 

提前感謝!

回答

1

在這種情況下,所有端點的行爲都不相同。

如果試圖寫入到不存在的FTP服務器,你一定會得到一個錯誤(拒絕連接或其它方式)..

這也是許多端點的真實。

如果SEDA隊列不存在,則會創建SEDA隊列,並且郵件將留在那裏。因此,您的路由實際上會發送到「notThere」,並且消息仍然會在那裏,直到應用程序重新啓動或某人開始使用來自seda的消息:notThere。這是seda隊列的設計方式。如果您將seda隊列的大小設置爲(「seda:notThere?size = 100」),那麼如果沒有人閱讀(或緩慢讀取),您將收到消息101並轉發異常。

如果您需要確定某條路線正在消耗您的消息,請使用「直接」而不是「seda」。你甚至可以有一些中間層使用SEDA的功能相對於分期和直接知道有消費有效(如果從收件人列表(上帝保佑)發送與可能的用戶輸入的功能。

from("whatever").recipentList(...); // "direct:ep1" work, "direct:ep2" throws exception 

from("direct:ep1").to("seda:ep1"); 
from("seda:ep1").doRealStagedStuffHere(); 
+0

謝謝你好!使用直接 - > seda選項是個好主意。但是,看起來有一個選擇是不需要根據需要創建SEDA隊列......或者至少有一些可以在這種情況發生時收到通知的監聽程序。 –

+0

你的意思是,只有從消費者調用時才創建SEDA隊列?在你的情況下,這樣的事情可能已經完成了,從更廣泛的角度看,消費者和生產者的數量可能會隨着時間的推移而變化,你可以有時間觸發sead conusmers等等。但是,Camel是開源的,所以你可以自由地使用這樣的選項:) –

+1

如果隊列中沒有活動的使用者,我記錄了有關失敗的故障單的故障單:https://issues.apache.org/jira/browse/CAMEL-6545 –

相關問題