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