2017-09-26 60 views
1

我想知道是否有人會知道我是否可以在FileInboundChannelAdapter中使用Watch服務以及LastModifiedFileListFilter?與觀察服務和LastModifiedFileListFilter的彈簧集成文件輪詢

下面的示例代碼給了我相當不一致的結果。有時文件只是在文件夾中,並且保持未處理狀態。

我懷疑監視服務可能與LastModifiedFileListFilter不兼容。對於例如

  • 如果LastModifiedFileListfilter設置爲尋找文件至少5 秒的歷史,輪詢設置爲每10秒輪詢。
  • 在第9秒,可以在監視的文件夾中創建文件。
  • 輪詢人員在10秒鐘內查詢手錶服務,以查明過去10秒內發生了什麼變化 。
  • 它找到新創建的文件。

  • 新創建的最後修改時間爲-1秒,所以它 不處理它。

  • 20秒鐘後,輪詢人員再次查詢手錶 服務,此時它看不到未處理的 文件,因爲它是在10秒以前創建的。

其他人會有這方面的經驗嗎?有沒有推薦的方法來解決這個問題,並允許我在繼續之前驗證文件是否已經完整寫入?

@Bean 
public IntegrationFlow ftpInputFileWatcher() 
{ 
    return IntegrationFlows.from(ftpInboundFolder(), filePoller()) 
      .handle() 
      /*abbreviated*/ 
      .get(); 
} 

private FileInboundChannelAdapterSpec ftpInboundFolder() { 
    LastModifiedFileListFilter lastModifiedFileListFilter = new LastModifiedFileListFilter(); 
    lastModifiedFileListFilter.setAge(5); 

    return Files.inboundAdapter(inboundFolder) 
      .preventDuplicates(false) 
      .useWatchService(true) 
      .filter(fileAgeFilterToPreventPrematurePickup()); 
} 

protected Consumer<SourcePollingChannelAdapterSpec> filePoller(){ 
    return poller -> poller.poller((Function<PollerFactory, PollerSpec>) p -> p.fixedRate(2000)); 
} 

謝謝!

回答

0

是的,那很好!

他們是不兼容的。 WatchService是基於事件的,並將來自事件的文件存儲到內部隊列中。當輪詢器觸發其操作時,輪詢來自該隊列的文件並應用其過濾器。由於LastModifiedFileListFilter放棄了該文件,並且不再有任何事件,我們將不會再看到該文件。

請在此事上提出JIRA,我們會考慮如何做。

同時,作爲解決方法,不要將WatchService用於這種邏輯。

+0

謝謝Artem,我已經記錄了INT-4351。 – yfl

+0

嗨Artem,它看起來像是不可能使用除默認以外的其他目錄掃描儀。請參閱錯誤:INT-4352。 – yfl

+0

爲了澄清,我需要監視服務的原因是,我可以在子目錄中選擇文件的更改。因爲這是Spring文檔的建議,所以我和Watch服務一起去了。但是,遇到上述問題後,我想切換到RecursiveLeafOnlyDirectoryScanner。那時我注意到你實際上不能使用不同的掃描儀。 – yfl