Подтвердить что ты не робот

Есть ли способ для опроса сил с помощью 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, было бы намного проще просто заставить опрос, чем переписывать все, используя пользовательский или сторонний опроллер. Спасибо!

4b9b3361

Ответ 1

Вы можете попробовать проект jpoller с открытым исходным кодом. Он реализует класс с именем DirectoryPoller, который периодически проверяет содержимое одного или нескольких каталогов. Это периодический поток, который ищет новые файлы, используя время последней модификации файла. Чтобы скачать исходный код, вы можете посетить http://jpoller.sourceforge.net/ Честно говоря, я не использовал jpoller. Я использовал события JDK 7 WatcherService.