Является ли Java 7 WatchService медленным для кого-то еще?
WatchService выглядит как отличная технология, но она слишком медленная, чтобы быть полезной в системах OS X и Linux, на которых я тестировал. Чтобы добавить оскорбление к травме, оно, похоже, не получает уведомления обо всех событиях.
Это случай как с моим собственным кодом, так и с каноническим примером из Oracle. (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java)
Я понимаю, что порт OSJ OpenJDK не уверен в этой функции (см. https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status)
Кто-нибудь успешно использовал это в производстве?
Ответы
Ответ 1
У меня гораздо лучшее время отклика, если я изменяю
folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
к
folder.register(watcher, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH);
Ответ 2
JDK 7 еще не имеет встроенной реализации WatchService для MacOS. Вместо того, чтобы слушать собственные события файловой системы, он использует резервную sun.nio.fs.PollingWatchService, которая периодически обходит файловую систему и проверяет последнюю измененную метку времени каждого файла и подкаталога в дереве. Я также обнаружил, что это необычно медленно.
Существует встроенная реализация WatchService для Mac:
http://code.google.com/p/barbarywatchservice/
Я не пытался сам его использовать.