2012-03-06 1 views
33

WatchService похож на отличную технологию, но ее слишком медленно, чтобы быть полезной в системах OS X и Linux, на которых я тестировал. Чтобы добавить оскорбление к травме, он, похоже, не получает уведомления обо всех событиях.Является ли Java 7 WatchService медленным для кого-то еще?

В этом случае как с моим собственным кодом, так и с каноническим примером из Oracle. (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java)

Я признаю, что порт OS X OpenJDK не уверен в этой функции (см https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status)

Кто-нибудь использовал это в производстве с успехом?

+3

Это очень раздражает [известная проблема] (https://bugs.openjdk.java.net/browse/ JDK-7133447) с 2012 года. – andruso

+1

Вопрос указывает «OS X и Linux», но ответы и комментарии, похоже, указывают на то, что это проблема только для OS X. –

ответ

24

JDK 7 еще не имеет встроенной функции WatchService для MacOS. Вместо того, чтобы слушать собственные события файловой системы, он использует резервную sun.nio.fs.PollingWatchService, которая периодически обходит файловую систему и проверяет последнюю измененную метку времени каждого файла и подкаталога в дереве. Я также обнаружил, что это необычно медленно.

Существует уроженцем реализация WatchService для Mac:

http://code.google.com/p/barbarywatchservice/

Я не пытался использовать его сам.

+6

Это все еще имеет место в JDK 8 для MacOS? –

+2

@ben, по-видимому, да. У нас все еще есть проблемы из-за того, что он очень медленный и не собирает все события. –

+2

Похоже, что это не будет разрешено для JDK 9. Проблема по-прежнему открыта https://bugs.openjdk.java.net/browse/JDK-7133447, и в прошлом обсуждении списка рассылки не было разрешения: http://mail.openjdk.java.net/pipermail/ nio-dev/2014-August/002691.html. –

30

у меня есть гораздо лучшие времена отклика, если я изменю

folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); 

в

folder.register(watcher, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH); 
+1

Лучше помните, что перечисление StandardWatchEventKinds находится в пакетах com.sun. *. – eskatos

+0

ДА! вот что сделало это для меня, у меня была задержка от 4 до 5 секунд, пока я не использовал это. Для справки скрипт, который я создал, приведен здесь: https://gist.github.com/DinisCruz-Dev/9214909 –

+0

То же самое для меня, у меня была отсрочка не менее 4 секунд, и это заставило его работать, как будто (обычно) работает на Linux или Windows. Большое спасибо. –

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

  • Нет связанных вопросов^_^