Изменить состояние WatchService

Я пишу приложение, которое будет сканировать каталог на наличие недавно добавленных файлов, а затем выполнять некоторую обработку с помощью WatchService. Эта часть работает, как и ожидалось. Теперь мне нужно написать код для обработки файлов, которые были добавлены в каталог до запуска службы.

Наивным подходом было бы просто получить список файлов в папке перед регистрацией пути в WatchService; Однако у меня есть опасения, что это может привести к разрыву между обработкой уже существующих файлов и отслеживанием новых событий, когда я могу пропустить входящие файлы. Самым безопасным вариантом было бы запустить Отслеживание событий, но не обрабатывать их, пока я не разберусь с уже присутствующими файлами.

Есть ли способ вручную изменить статус WatchKey на «сигнализированный»? Это позволит достичь моих целей, но я не вижу способа сделать это в документации WatchService.


person bendicott    schedule 11.09.2018    source источник


Ответы (1)


Наивным подходом было бы просто получить список файлов в папке перед регистрацией пути в WatchService; Однако у меня есть опасения, что это может привести к разрыву между обработкой уже существующих файлов и отслеживанием новых событий, когда я могу пропустить входящие файлы. Самым безопасным вариантом было бы запустить Отслеживание событий, но не обрабатывать их, пока я не разберусь с уже присутствующими файлами.

Вот способ решения проблем:

Запустите watch-service и get-files-list-from-folder-process одновременно.

Оба этих процесса помещают файл (путь к файлу) в потокобезопасную коллекцию очередей — first — что позволяет выполнять обработку в порядке поступления (LIFO) или в порядке поступления (FIFO). Можно рассмотреть java.util.concurrent.ConcurrentLinkedDeque, LinkedBlockingDeque, ConcurrentLinkedQueue или LinkedBlockingQueue в зависимости от требований. Таким образом, все файлы обрабатываются один за другим - независимо от того, из процесса получения-списка-файлов-из-папки или службы наблюдения.

Но требуется проверка, чтобы избежать дублирования обработки файлов, чтобы убедиться, что файл не добавлен в очередь дважды. Это понадобится только в начале применения. Сама фактическая программа обработки файлов может отслеживать файлы, обработанные в другой коллекции, что можно использовать для проверки того, обработан ли уже файл.

person prasad_    schedule 12.09.2018