2014-02-27 45 views
1

我們的系統使用以下Spring集成輪詢太慢

<int-file:inbound-channel-adapter 
     directory="file:#{'${poller.landingzonepath}'.toLowerCase()}" channel="createMessageChannel" 
     filename-regex="${ingestion.filenameRegex}" queue-size="10000" 
     id="directoryPoller" scanner="leafScanner"> 
<!--  <int:poller fixed-rate="${ingestion.filepoller.interval:10000}" max-messages-per-poll="100" /> --> 
     <int:poller fixed-rate="10000" max-messages-per-poll="1000" /> 
    </int-file:inbound-channel-adapter> 

我們也有從默認RecursiveLeafOnlyDirectoryScanner延伸leafScanner,我們leafscanner沒有做太多Spring集成項目。只需針對正則表達式屬性檢查一個目錄。

我們看到的問題是存在250,000個(.landed [我們關心的文件]文件),這意味着我們正在輪詢的目錄中有大約500k個實際文件。這是對舊系統的重新設計,重新設計使應用程序更具可擴展性,同時不受輪詢父目錄內的目錄名稱的影響。我們想要擺脫每個特定目錄的輪詢器,但似乎除非我們做錯了什麼,否則我們必須回到這個問題。

如果有人有任何可能的解決方案或配置項目,我們可以嘗試請讓我知道。在我的本地機器上安裝了66k的.lan文件,大約需要16分鐘才能將第一個文件提交給我們的變壓器來做某件事。

回答

2

正如JavaDocs指出的那樣,RecursiveLeafOnlyDirectoryScanner不能很好地適應大型目錄或深層樹木。

你可以讓你的leafScanner狀態和,而不是子類RecursiveLeafOnlyDirectoryScanner,子類DefaultDirectoryScanner和實施listEligibleFiles和返回時,你有1000個文件你在哪裏保存後關閉;並在下一次民意調查中繼續從你離開的地方開始;當你到達最後時,從頭開始重新開始。

您可以在字段中維護狀態(這意味着您將在JVM重新啓動後重新開始)或使用一些持久性。

+0

是的,我讀到了有關RecursiveLeafOnlyDirectoryScanner的內容,但找不到任何提到的上限。 – John

0

只是一個更新。我們的實現如此緩慢的原因是鎖定(試圖防止重複),鎖定(防止重複)通過添加過濾器自動禁用。 如果您想要添加線程池,則每個輪詢的最大消息數也非常重要。沒有這個,你將看不到性能的改善。