Как я могу переименовать файл, помещенный в удаленное местоположение, пока он получает поток - PullRequest
1 голос
/ 20 июня 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 20 июня 2019

рассмотрите возможность использования блокировки файлов вместо переименования. Вот соответствующая часть из 13.2 Reading Files пружинной интеграции документации:

Когда несколько процессов читают из одного каталога, может быть желательно заблокировать файлы, чтобы предотвратить их одновременный захват. Для этого вы можете использовать FileLocker. Существует готовая реализация на основе java.nio, но также возможно реализовать собственную схему блокировки. Шкафчик nio может вводиться следующим образом:

<int-file:inbound-channel-adapter id="filesIn"
    directory="file:${input.directory}" prevent-duplicates="true">
    <int-file:nio-locker/>
</int-file:inbound-channel-adapter>

Пользовательский шкафчик, который вы можете настроить следующим образом:

<int-file:inbound-channel-adapter id="filesIn"
    directory="file:${input.directory}" prevent-duplicates="true">
    <int-file:locker ref="customLocker"/>
</int-file:inbound-channel-adapter>

[Примечание] Когда для входящего в файл адаптера настроен блокировщик, он берет на себя ответственность за блокировку до того, как файл будет разрешен к приему. Он не будет нести ответственность за разблокировку файла. Если вы обработали файл и держите замки, у вас есть утечка памяти. Если это проблема в вашем случае, вы должны сами вызвать FileLocker.unlock (File file) в соответствующее время.

Для получения дополнительной информации см. Документы для Интерфейс FileLocker и Класс NioFileLocker .

0 голосов
/ 20 июня 2019

Я бы использовал Apache Commons FileUtils. https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html#moveFile

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

...