2017-09-26 3 views
1

LastModifiedFileListFilterと一緒にFileInboundChannelAdapterでウォッチサービスを使用できるかどうか知りたいのですか?WatchサービスとLastModifiedFileListFilterを使用したSpring統合ファイルポーラー

以下のサンプルコードは、私にかなり矛盾した結果を与えています。場合によっては、ファイルがフォルダ内に置かれ、未処理のままになることがあります。

時計サービスがLastModifiedFileListFilterと互換性がない可能性があります。例えば、

  • LastModifiedFileListfilterは少なくとも5 秒古いファイルを探すように設定され、ポーラーは、10秒ごとにポーリングするように設定されている場合。
  • 9秒目に、監視フォルダにファイルを作成できます。
  • ポーラは10秒後に時計サ​​ービスに問い合わせて、 が過去10秒間に何が変更されたかを調べます。
  • 新しく作成されたファイルが見つかりました。

  • 新しく作成されたのは最終修正時刻が-1秒なので、 は処理しません。

  • ポーラは時計 を2回目にクエリしますが、今回は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

私が監視サービスを必要としたのは、明らかにするために、サブディレクトリ内のファイルに対する変更を取り上げることができるようにするためです。私は春のドキュメンタリーの推薦だったので、時計サービスに行った。しかし、上記の問題が発生した後、私はRecursiveLeafOnlyDirectoryScannerに切り替えたいと思っていました。それで、実際には別のスキャナを使うことができないことに気づいたのです。 – yfl

関連する問題