Изменить состояние WatchService - PullRequest
0 голосов
/ 12 сентября 2018

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

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

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

1 Ответ

0 голосов
/ 12 сентября 2018

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

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

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

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

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

...