Из прочтения документации Spring SFTP (http://docs.spring.io/spring-integration/reference/html/sftp.html) не совсем понятно, можно ли предотвратить повторную загрузку успешно переданных файлов, которые впоследствии удаляются.
Передаваемые файлы имеют большой размер и обрабатываются локальной задачей, а затем могут быть удалены.
Однако Spring SFTP обнаруживает, что они были удалены (либо во время выполнения, либо при перезапуске), и повторно загружает их.
Я уже использую SftpPersistentAcceptOnceFileListFilter
, чтобы выжить после перезапуска.
Вышеупомянутое обсуждение относится к фильтрации файлов перед их извлечением. После получения файлов к файлам в файловой системе применяется дополнительный фильтр. По умолчанию это параметр
AcceptOnceFileListFilter
, который, как уже говорилось, сохраняет состояние в памяти и не учитывает время изменения файла. Если ваше приложение не удалит файлы после обработки, адаптер повторно обработает файлы на диске по умолчанию после перезапуска приложения.Кроме того, если вы настроите фильтр для использования FtpPersistentAcceptOnceFileListFilter, а временная метка удаленного файла изменится (что приведет к ее повторной выборке), локальный фильтр по умолчанию не позволит обрабатывать этот новый файл.
Используйте атрибут local-filter для настройки поведения фильтра локальной файловой системы. Чтобы решить эти конкретные варианты использования, вы можете вместо этого использовать FileSystemPersistentAcceptOnceFileListFilter в качестве локального фильтра. Этот фильтр также сохраняет принятые имена файлов и измененную временную метку в экземпляре стратегии the
MetadataStore
(Раздел 9.5, «Хранилище метаданных») и обнаруживает изменение времени изменения локального файла.
Отсюда, где упоминается удаление локальных файлов, я не знаю, что мне делать.
Вот моя соответствующая конфигурация:
<int-sftp:inbound-channel-adapter id="sftpInboundAdapter"
auto-startup="true" channel="receiveChannel" session-factory="sftpSessionFactory"
local-directory="file:local-dir" remote-directory="files"
auto-create-local-directory="true" delete-remote-files="false"
filter="compositeFilter">
<int:poller fixed-rate="1000" max-messages-per-poll="1" />
</int-sftp:inbound-channel-adapter>
<bean id="compositeFilter"
class="org.springframework.integration.file.filters.CompositeFileListFilter">
<constructor-arg>
<list>
<bean
class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter">
<constructor-arg value="*.zip" />
</bean>
<bean
class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
<constructor-arg name="store" ref="metadataStore" />
<constructor-arg value="foo/bar" />
</bean>
</list>
</constructor-arg>
</bean>