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