В WatchService, что происходит между key . pollEvents () и key . reset () ?pollEvents() и key.reset()?

#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 /…