7

監視サービスを使用してディレクトリを監視し、新しく作成されたファイルでロジックを起動しています。私が最近経験した課題の 1 つは、大量のファイルを処理する必要があり、処理が速すぎて監視ディレクトリにコピーされたときに、オーバーフローがトリガーされることです。

APIは、オーバーフローについて次のように述べています。

ファイル システムは、イベントを取得または処理するよりも速くレポートする場合があり、実装によって、蓄積できるイベントの数に不特定の制限が課される場合があります。実装が意図的にイベントを破棄する場合、キーの pollEvents メソッドが OVERFLOW のイベント タイプを持つ要素を返すように調整します。

私の質問は、処理する必要があるイベントを失うことなく、オーバーフローを適切に処理するにはどうすればよいですか?

私のwatchserviceコードは次のようになります:

            Path myDir = Paths.get(srcDir);
            try(WatchService watcher = myDir.getFileSystem().newWatchService()){
                myDir.register(watcher, ENTRY_CREATE,ENTRY_MODIFY);
                int x = 0;
                for(;;){
                    x++;
                    WatchKey watchKey = watcher.take();
                    LOGGER.debug("Event # {}",x);
                    List<WatchEvent<?>> events = watchKey.pollEvents();
                    LOGGER.info("Events Size {}",events.size());
                    for (WatchEvent event : events) {
                        if(event.kind() == OVERFLOW){
                            LOGGER.error("The Maximum watchService events has been reached!");
                            System.exit(1); //I exit so I know there is a problem - but how should I handle this? 
                        }
                        if (event.kind() == ENTRY_CREATE) {
                            LOGGER.info("File created: " + event.context().toString());
                            LOGGER.info("Beginning Processing:" +event.context().toString());
                            ...business logic here...
                        }
                    }
                    watchKey.reset();
                }
          ...
4

1 に答える 1

2

実際にオーバーフロー イベントを見たことがありません。監視しているディレクトリを再処理する必要があることを通知するためのものです。プログラムを終了する必要はありません。単一のスレッド化された File.list() 呼び出しを使用してディレクトリをクロールするだけです。私はそれをどのように処理するかを以下にカットアンドペーストしました. このコード...

1) 問題を記録する

2) ディレクトリ内のすべてのファイルをクロールするディレクトリ再処理をトリガーするフラグを設定します

3) この WatchEvent の残りの処理をスキップします

// log overflow events and trigger reprocess later.
if (kind == OVERFLOW) 
{
    logger.warn("File listener recieved an overflow event.  You should probably check into this");
    overflowTriggeredFlag = true;
    continue;
}
于 2013-07-29T15:21:53.153 に答える