Apache JCI FilesystemAlterationMonitor обрабатывает изменения существующего содержимого папки при запуске - PullRequest
1 голос
/ 23 декабря 2011

Я использую FAM (FileAlterationMonitor) Apache JCI в сервисе Java OSGi для мониторинга и обработки изменений в файловой системе. Кажется, все работает довольно хорошо, за исключением того, что когда я запускаю Службу (которая запускает FAM с использованием приведенного ниже кода), FAM обнаруживает ВСЕ изменения, которые существуют в каталоге.

Сейчас смотрю / tmp / tmp включает поддерево: / tmp / foo / bar / cat / dog

Каждый раз, когда я запускаю службу и запускает FAM, она сообщает о событиях DirectoryCreate для:

/tmp/foo
/tmp/foo/bar
/tmp/foo/bar/cat
/tmp/foo/bar/cat/dog

Даже если никакие изменения не были внесены ни в одну часть этого поддерева.

Код запускаемый при активации услуги:

File watchFolder = new File("/tmp"); 
watchFolder.mkdirs();

fam = new FilesystemAlterationMonitor();
fam.setInterval(1000);
fam.addListener(watchFolder, listener);
fam.start();
// I've already tried adding:
listener.waitForFirstCheck();

Пример слушателя:

private FileChangeListener listener = new FileChangeListener() {
    public void onDirectoryChange(File pDir) { System.out.println(pDir.getAbsolutePath()); }
    public void onDirectoryCreate(File pDir) { System.out.println(pDir.getAbsolutePath()); }
    ...
}

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Да, это одна очень раздражающая особенность JCI.Когда мониторинг запущен, он уведомит вас обо всех найденных файлах и каталогах с помощью вызовов onXxxCreate().Я думаю, что у вас есть следующие опции

  • После запуска мониторинга подождите некоторое время (пару секунд) в вашей реализации FileChangeListener обратного вызова, прежде чем вы фактически обработаете события, поступающие из JCI.Это то, что я сделал в проекте, и он работает довольно хорошо, хотя есть вероятность, что вы пропустите фактическое создание файла, которое просто происходит в течение «льготного периода»
  • Возьмите источники JCI и измените их для использованиядва новых метода событий onDirectoryFound(File) и onFileFound(File), которые будут запускаться только при обнаружении файлов и каталогов при запуске мониторинга
  • Взгляните на java.nio.file.WatchService, который поставляется с Java 7. IMO - лучший вариант, поскольку он использует собственные методы для извещения ОС об изменениях вместо того, чтобы запускать поток и периодически проверять.С JCI вы можете получить задержки в диапазоне нескольких секунд, пока изменения не будут распространены на ваши обратные вызовы
0 голосов
/ 26 ноября 2014

Забудьте о WatchService. Он не интуитивно понятен, и с ним возникают проблемы при попытке определить, может ли он обнаружить, что папка, которую он отслеживает, удалена или изменена. Я бы держался подальше от этого. Я работал с Watcher, но предпочитаю Apache IO. Я верю, что Верблюд также использует это.

...