2014-01-25 70 views
12

我想安裝使用Spring集成一個簡單的應用程序。目標是簡單地使用文件入站通道適配器來監視新文件的目錄,並在添加文件時處理文件。爲簡單起見,目前處理文件只是記錄一些輸出(正在處理的文件的名稱)。不過我想要以多線程的方式處理文件。因此可以說10個文件被拾取並且應該被並行處理,並且一旦這些文件完成,那麼我們繼續下一個10個文件。Spring集成輪詢調度VS

對於我嘗試了兩種不同的方法,並似乎都同樣的工作,我想了解使用輪詢或調度員這樣的事情之間的差異。

方法#1 - 使用輪詢

<int-file:inbound-channel-adapter id="filesIn" directory="in"> 
     <int:poller fixed-rate="1" task-executor="executor" /> 
</int-file:inbound-channel-adapter> 

<int:service-activator ref="moveToStage" method="move" input-channel="filesIn" /> 

<task:executor id="executor" pool-size="5" queue-capacity="0" rejection-policy="DISCARD" /> 

所以在這裏我所理解的想法是,我們都在不斷輪詢的目錄,並儘快將文件接收其發送到filesIn通道,直到池限制是到達。然後,直到池被佔用,即使我假設輪詢仍在後臺繼續,也不會發送其他文件。這似乎工作,但我不確定是否使用每個輪詢的最大消息可以幫助減少輪詢頻率。通過設置每個輪詢的最大消息接近池大小。

方法2 - 使用調度

<int-file:inbound-channel-adapter id="filesIn" directory="in"> 
    <int:poller fixed-rate="5000" max-messages-per-poll="3" /> 
</int-file:inbound-channel-adapter> 

<int:bridge input-channel="filesIn" output-channel="filesReady" /> 

<int:channel id="filesReady"> 
    <int:dispatcher task-executor="executor"/> 
</int:channel> 

<int:service-activator ref="moveToStage" method="move" input-channel="filesInReady" /> 

<task:executor id="executor" pool-size="5" queue-capacity="0" rejection-policy="CALLER_RUNS" /> 

好了,所以這裏的輪詢未使用執行人所以我假設以連續的方式其輪詢。應該拾取每個輪詢3個文件,然後發送到filesReady通道,然後使用分派器將文件傳遞到服務激活器,並且由於它使用調度程序的執行程序,它立即返回控制並允許filesIn通道發送更多文件。

我想我的問題是我在正確的,如果一個是比其他更好的理解這兩種方法。

謝謝

回答

6

是的,你的理解是正確的。

一般來說,我會說,輪詢每毫秒(和丟棄投票時隊列已滿)的資源(CPU和I/O)的浪費。

此外,在第一種情況下增加每次輪詢的最大消息數量並不會有幫助,因爲輪詢是在執行程序線程上完成的(調度程序將輪詢移交給執行程序,該線程將處理mmpp)。

在第二種情況下,由於調度線程投票時(而不是之前)把手拿開時,mmpp將正常工作。

所以,一般情況下,你的第二個實現是最好的(只要你能平均2.5秒延遲住在一個新的文件(S)到達)。

+0

好吧,這是有道理的。此外,它還允許輪詢過程獨立於流程中正在處理的文件速度來提取文件。我想知道,如果文件輪詢器撿起太多的文件,並傳遞到下一個使用任務執行器調度程序的通道。由於使用caller_runs策略,即使線程數達到極限,現在分派器必須在控制返回到文件輪詢器之前完成當前排隊的文件,以便它可以繼續輪詢以獲得更多的輪詢文件。 – adeelmahmood