#java #events #watchservice
#java #Мероприятия #watchservice
Вопрос:
Глядя на этот пример Java, о состоянии ключа, Oracle говорит:
Ready указывает, что ключ готов принимать события. При первом создании ключ находится в состоянии готовности.
Signaled указывает, что одно или несколько событий поставлены в очередь. После того, как ключ был сигнализирован, он больше не находится в состоянии готовности, пока не будет вызван метод сброса.
В WatchKey
javadoc:
События, обнаруженные, когда ключ находится в сигнальном состоянии, помещаются в очередь, но не вызывают повторной постановки ключа в очередь для извлечения из службы наблюдения
В документации не указано, что происходит с событиями, сгенерированными между key.pollEvents()
и key.reset()
? Предполагается, что события будут буферизоваться до тех пор, пока ключ не будет сброшен, и ключ будет сигнализирован сразу после сброса. Похоже, это подтверждается приведенным ниже тестом.
Не могли бы вы указать мне на какую-нибудь официальную документацию? или к обсуждению отсутствия документации?
Path dir = Paths.get("test");
WatchService watcher = dir.getFileSystem().newWatchService();
dir.register(watcher, CREATE, DELETE, MODIFY);
while (true) {
WatchKey key = watcher.take();
System.out.println("polling.");
for (WatchEvent<?> event : key.pollEvents()) {
... (details removed) ...
System.out.format(" Event %s in [%s] for entry [%s]%n",
event.kind().name(), registeredDir, childPath);
try { Thread.sleep(20000); } catch (InterruptedException e) { ; }
}
System.out.println("resetting.");
key.reset();
}
… в течение 20 секунд, разрешенных sleep()
, я сделал:
- Создайте файл,
- Отредактируйте его, сохраните,
- Переименуйте его,
- Отредактируйте его, сохраните,
- Удалите его
Вывод:
polling.
Event ENTRY_CREATE in [test] for entry [testfile1.txt]
resetting.
polling.
Event ENTRY_MODIFY in [test] for entry [testfile1.txt]
Event ENTRY_DELETE in [test] for entry [testfile1.txt]
Event ENTRY_CREATE in [test] for entry [testfile2.txt]
Event ENTRY_MODIFY in [test] for entry [testfile2.txt]
Event ENTRY_DELETE in [test] for entry [testfile2.txt]
resetting.
Tks.
Ответ №1:
Похоже, что дополнительные события буферизуются и будут обработаны или им будет присвоен тип события ПЕРЕПОЛНЕНИЯ, когда буфер заполнится.
из документации для watchservice :
«Файловые системы могут сообщать о событиях быстрее, чем они могут быть извлечены или обработаны, и реализация может налагать неопределенное ограничение на количество событий, которые она может накапливать. Если реализация сознательно отбрасывает события, то она организует, чтобы метод pollEvents ключа возвращал элемент с типом события ПЕРЕПОЛНЕНИЯ. Это событие может быть использовано потребителем в качестве триггера для повторного изучения состояния объекта. «
Комментарии:
1. У вас есть ссылка, подтверждающая эту возможность?
2. @минут я просто смотрю на docs.oracle.com/javase/7/docs/api/java/nio/file/… Я не тестировал это.
3. Я отредактировал свой вопрос, чтобы показать некоторые проведенные мной тесты, ПЕРЕПОЛНЕНИЕ не срабатывает. Кажется, что события буферизуются и становятся доступными, как только ключ сбрасывается. Но я не могу найти никакого подтверждения.
4. @mins это один из примеров набора тестов, вызывающих ПЕРЕПОЛНЕНИЕ. github.com/AdoptOpenJDK/openjdk-jdk9u/blob/master/jdk/test/java /…