Есть ли способ для опроса сил с помощью WatchService?
У меня есть рабочий код, который прослушивает каталог с помощью WatchService и отвечает на события, которые я указываю. Это отлично работает и проверено как на linux, так и на mac (хотя на последнем видно, что используется опрос).
Однако, когда я развернул это в процессе производства, оказывается, что контролируемый каталог - это монтирование NFS. Поскольку WatchService использует inotify при работе в Linux, никогда не было никаких событий, вызванных тем, что NFS mounts не запускают события inotify (или что-то вроде этого, здесь больше информации, что объясняет мою проблему: Java WatchService не генерирует события при просмотре подключенных дисков).
Так как мой код уже написан, я бы предпочел заставить WatchService использовать реализацию опроса, а не inotify. Есть ли способ сделать это?
Я попытался найти исходный код sun.nio.fs.PollingWatchService и создать объект напрямую (вместо использования FileSystems.getDefault(). newWatchService()), но при регистрации службы с помощью пути я получил это исключение: java.nio.file.ProviderMismatchException.
Итак, какие-то идеи? Поскольку я уже реализовал код с помощью WatchService и WatchKey API, было бы намного проще просто заставить опрос, чем переписывать все, используя пользовательский или сторонний опроллер. Спасибо!
Ответы
Ответ 1
Вы можете попробовать проект jpoller с открытым исходным кодом. Он реализует класс с именем DirectoryPoller, который периодически проверяет содержимое одного или нескольких каталогов.
Это периодический поток, который ищет новые файлы, используя время последней модификации файла.
Чтобы скачать исходный код, вы можете посетить http://jpoller.sourceforge.net/
Честно говоря, я не использовал jpoller. Я использовал события JDK 7 WatcherService.
Ответ 2
У нас была аналогичная проблема, и я решил отказаться от использования WatchService. Существует несколько библиотек, реализующих объединение. Я бы порекомендовал Apache Commons IO Monitor:
https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html