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

Глядя на этот пример Java о состоянии ключа, Oracle говорит :

Готово указывает, что ключ готов принимать события. При первом создании ключ находится в состоянии готовности.

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 [test\file1.txt]
resetting.
polling.
  Event ENTRY_MODIFY in [test] for entry [test\file1.txt]
  Event ENTRY_DELETE in [test] for entry [test\file1.txt]
  Event ENTRY_CREATE in [test] for entry [test\file2.txt]
  Event ENTRY_MODIFY in [test] for entry [test\file2.txt]
  Event ENTRY_DELETE in [test] for entry [test\file2.txt]
resetting.

спасибо


person mins    schedule 21.06.2014    source источник


Ответы (1)


Похоже, что дополнительные события буферизуются и будут обработаны или получат тип события ПЕРЕПОЛНЕНИЕ, когда буфер заполнится.

из документации для watchservice :

«Файловые системы могут сообщать о событиях быстрее, чем они могут быть получены или обработаны, и реализация может наложить неуказанный предел на количество событий, которые она может накапливать. с типом события ПЕРЕПОЛНЕНИЕ. Это событие может использоваться потребителем в качестве триггера для повторной проверки состояния объекта».

person pwilmot    schedule 21.06.2014
comment
У вас есть ссылка, чтобы подтвердить эту возможность? - person mins; 21.06.2014
comment
@mins Я просто смотрю на docs.oracle. com/javase/7/docs/api/java/nio/file/ я не проверял. - person pwilmot; 21.06.2014
comment
Я отредактировал свой вопрос, чтобы показать некоторые тесты, которые я провел, ПЕРЕПОЛНЕНИЕ не срабатывает. Кажется, что события буферизуются и становятся доступными, как только ключ сбрасывается. Но не могу найти подтверждения. - person mins; 21.06.2014
comment
@mins это один из примеров набора тестов, вызывающих ПЕРЕПОЛНЕНИЕ. github.com/ Принять OpenJDK/openjdk-jdk9u/blob/master/jdk/test/java/ - person DanielCuadra; 04.06.2020