監視サービスを使用してディレクトリを監視し、新しく作成されたファイルでロジックを起動しています。私が最近経験した課題の 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();
}
...