2015-02-26 2 views
13

У меня есть рабочий код, который прослушивает каталог с помощью WatchService и отвечает на события, которые я указываю. Это отлично работает и проверено как на linux, так и на mac (хотя на последнем видно, что используется опрос).Есть ли способ для силового опроса с использованием WatchService?

Однако, когда я развернул это в процессе производства, выясняется, что контролируемый каталог является монтированием NFS. Поскольку WatchService использует inotify при работе в Linux, никогда не происходило никаких событий, потому что NFS-монтирования не запускают события inotify (или что-то вроде этого, здесь есть дополнительная информация, которая объясняет мою проблему: Java WatchService not generating events while watching mapped drives).

Поскольку мой код уже написан, я бы предпочел заставить WatchService использовать реализацию опроса, а не inotify. Есть ли способ сделать это?

Я попытался найти исходный код sun.nio.fs.PollingWatchService и создать объект напрямую (вместо использования FileSystems.getDefault(). NewWatchService()), но при регистрации службы с помощью пути я получил это исключение : java.nio.file.ProviderMismatchException.

Итак, любые идеи? Поскольку я уже реализовал код с помощью WatchService и WatchKey API, было бы намного проще просто заставить опрос, чем переписывать все, используя пользовательский или сторонний опроллер. Благодаря!

+0

Это своего рода медленный и неэффективный, но то, что о 'Файл F = новый файл (YOUR_DIRECTORY, "_garbage.tmp"); новый FileOutputStream (f) .close(); f.delete(); 'и просто слушать создание файлов с именем' _garbage.tmp "'? –

+0

@k_g: Спасибо за ответ, но я не понимаю, как это помогает. Любой шанс, который вы могли бы разработать? – rjcarr

+0

Если вы создадите файл и удалите его, он должен запустить событие WatchService, правильно? –

ответ

2

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

Смежные вопросы