Наблюдатель за файлами Java с несколькими JVM, отслеживающими один каталог для входящих файлов

У меня есть ситуация, когда два java-приложения просматривают каталог для входящего файла. Скажем, есть каталог DIR, который отслеживается двумя процессами JVM для любых файлов с расширением .SGL.

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

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

Но для этой ситуации у нас нет базы данных.

Каков наилучший способ справиться с такими проблемами? Можем ли мы полагаться на решения по переименованию файлов? Является ли переименование файлов атомарной операцией?


person Mayuran    schedule 28.09.2017    source источник


Ответы (2)


Для такой ситуации Spring Integration предлагает FileSystemPersistentAcceptOnceFileListFilter: https://docs.spring.io/spring-integration/reference/html/files.html#file-reading

  • Сохраняет «увиденные» файлы в хранилище метаданных, чтобы выдержать перезапуски приложения.
  • Ключ по умолчанию — «префикс» плюс абсолютное имя файла; значение — временная метка файла.
  • Файлы считаются уже «просмотренными», если они существуют в магазине и имеют
  • то же время изменения, что и текущий файл.

Когда вы разделяете постоянные MetadataStore для всех экземпляров вашего приложения, только один из них будет обрабатывать файл. Все остальные просто фильтруют.

person Artem Bilan    schedule 28.09.2017

Каждый наблюдатель (даже два в одной JVM) всегда должен быть уведомлен о добавлении нового файла.

Если вы хотите разделить работу, вы можете либо

  • используйте одну JVM для запуска вдвое большего количества потоков и разделите работу через очередь.
  • use an operation which will only succeed for one JVM. e.g.
    • file rename
    • создать файл блокировки
    • заблокировать сам файл

Является ли переименование файлов атомарной операцией?

Да, только один процесс может успешно переименовать файл, даже если оба пытаются переименовать одно и то же имя.

person Peter Lawrey    schedule 28.09.2017