2012-03-17 112 views
4

我最近開始玩Apache Apache camel。所以作爲實驗類型,我認爲我會創建一個簡單的項目,每隔幾秒掃描一次文件目錄,以查看是否有新文件選擇該文件,然後將其複製到另一個文件夾。稍後我想將這些文件放入數據庫中。在Apache中輪詢文件消費者

所以從基本保持第一我創建了一個途徑,如下列:

from("file://c:/CTest/inbox?noop=true") 
       .to("file://C:/Ctest/outbox"); 

這個工作,我覺得OK讓我們添加一個計時器。最初,我做了使用定時器和嘗試此的錯誤:

from("timer://myTimer?period=50").to("file://c:/CTest/inbox?noop=true") 
       .to("file://C:/Ctest/outbox"); 

我那麼有大約不能夠寫一個文件中的一些奇怪的例外。然後,我通過在定時器路由之後放置文件路徑實現了生產者。所以我研究了一下,這裏我有點困惑。

所以從我的理解文件組件使用調度輪詢模式。文件路徑url模式中甚至有一個pollStrategy選項。還有一個投票消費者EIP。

因此,這裏是我的困惑套英寸

1)如果文件組件使用計劃的投票格局不會使用/實現輪詢conumser EIP?

2)如何向文件組件添加一個簡單的計劃,以便每30秒使用一次文件?

3)如何通過實現org.apache.camel.PollingConsumerPollStrategy創建自己的pollingStrategy?

我懷疑我可以做這樣的事情:

from("file://c:/CTest/inbox?noop=true&pollStrategy=some-expression") 
       .to("file://C:/Ctest/outbox"); 

我試圖解決這個問題一些例子,但我要麼不看正確的地方或完全缺失的情節。我想這不是一個代碼相關的問題,而是更多的是什麼是這種方法的最佳策略/模式。

感謝 Namphibian

+0

能否請你指導你如何使用從()API?我不確定需要完成哪些配置以及如何進行? – Prateek 2016-09-23 18:01:03

回答

6

駱駝提供了一個功能叫做routepolicy http://camel.apache.org/routepolicy.html

它可以讓你的政策路線關聯。我們提供了許多開箱即用的政策。政策可以是任何種類的邏輯。例如,我們提供了一個限制策略,該策略基於threadsholds實時掛起/恢復路由。

另一個開箱政策是計劃的政策,所以你可以指定路由「開放時間」。所以你也可以使用它。但請注意開放時間,以便指定開始/結束時間。有一個基於石英cron的政策http://camel.apache.org/cronscheduledroutepolicy.html,所以你可以配置這個星期一開始路線,讓它運行一段時間。

如果您需要從路線內停止路線,那麼這就是一個比較複雜一點,有一個關於這個在這裏FAQ:http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html

+0

謝謝克勞斯。似乎我還有很長的路要走。那麼是否有可能從計時器或石英組件啓動駱駝路線?對,所以我想沒有正確的答案,但是什麼時候使用輪詢策略,何時使用路由策略,何時使用延遲?您的想法和經驗將不勝感激。 – Namphibian 2012-03-18 11:37:25

+0

這取決於您的需求。 pollEnrich一次只能拾取一個文件,所以它有其侷限性,如果您的用例是拾取並處理目錄中的所有文件。如果是這樣的話,路線政策更有意義。 – 2012-03-20 04:41:45

3

1)如果文件組件使用計劃的投票表決方式做它 使用/實現輪詢conumser EIP?

是的,文件生產者實現了ScheduledPollEndpoint。從doc

不少入境駱駝端點使用計劃的投票模式 接收消息並通過駱駝加工路線推他們。 也就是說,從客戶端的外部端點似乎使用 事件驅動的消費者,但內部調度輪詢用於 監視某種狀態或資源,然後啓動消息 交流。由於這是一個這樣的常見模式,輪詢組件可以擴展ScheduledPollConsumer基類,這使得它更簡單到 實現此模式。

2)如何添加一個簡單的時間表,該文件組件消耗 文件SA每隔30秒?

使用delay選項:

from("file://c:/CTest/inbox?noop=true&delay=30000").to("file://C:/Ctest/outbox"); 

3)如何創建我自己通過實施org.apache.camel.PollingConsumerPollStrategy pollingStrategy?

看一看源代碼:DefaultPollingConsumerPollStrategyLimitedPollingConsumerPollStrategy

您使用自定義pollStrategy這樣的:

from("file://inbox/?pollStrategy=#myPoll").to(...) 

凡#myPoll我在this頁面底部的registry更多信息定義。

+0

嗨ebaxt。好吧,所以我不必實施投票策略,如果我只是想每30秒輪詢一次就說?我通過使用延遲選項來達到此目的(讓自己嘗試閱讀更多一點)。那麼對於更復雜的場景,我會定義一個bean並用它來定義一個時間表,例如,每天星期一上午11:30投票。 – Namphibian 2012-03-17 09:25:32

+0

我只是使用延遲,它像一個魅力。我不相信這很容易。駱駝岩石!回答問題我會更多地研究自定義輪詢策略!謝謝。 – Namphibian 2012-03-17 09:30:35

+0

如果您需要更多地控制輪詢計劃,可以使用quartz組件並使用pollEnrich,如下所示:'from(「quartXXXX」).pollEnrich(「file:// xx」).to(...);' – ebaxt 2012-03-17 09:52:37