2016-05-05 2 views
3

Считая документы Spring SFTP (http://docs.spring.io/spring-integration/reference/html/sftp.html), не совсем ясно, возможно ли предотвратить перезагрузку успешно перенесенных файлов, которые впоследствии удаляются.Spring integration SFTP - не обновлять локально удаленные файлы

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

Однако Spring SFTP подбирает то, что они были удалены (либо во время выполнения, либо перезагрузка), и перезагружают их.

Я уже пользуюсь SftpPersistentAcceptOnceFileListFilter, чтобы пережить перезагрузку.

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

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

Используйте атрибут local-filter для настройки поведения локального фильтра файловой системы . Чтобы решить эти конкретные варианты использования, вы можете вместо этого использовать FileSystemPersistentAcceptOnceFileListFilter в качестве локального фильтра . Этот фильтр также сохраняет принятые имена файлов и измененную временную метку в экземпляре стратегии 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> 

ответ

0

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

F[] files = session.list(remoteDirectory); 
if (!ObjectUtils.isEmpty(files)) { 
    List<F> filteredFiles = filterFiles(files); 
    for (F file : filteredFiles) { 
     try { 
      if (file != null) { 
       copyFileToLocalDirectory(
         remoteDirectory, file, localDirectory, 
         session); 
      } 
     } 
... 
+0

Гэри, это временная метка на удаленном сайте? –

+0

Да; удаленные и локальные фильтры независимы - если постоянный (удаленный) 'filter' обнаруживает файл, который еще не был загружен, или временная метка на удаленном сервере была изменена, она загружается, в противном случае она пропускается. Если вы используете Redis для своего хранилища метаданных, вы можете использовать 'redis-cli' и' monitor' для просмотра обновлений в реальном времени. –

+0

Это имеет смысл, Гарри. Я обновил свой вопрос с помощью config - и дважды проверял, что файлы по-прежнему перезагружаются после локального удаления. –