2016-05-05 7 views
3

Spring SFTPのドキュメント(http://docs.spring.io/spring-integration/reference/html/sftp.html)を読むと、後で削除される正常に転送されたファイルの再ダウンロードを防ぐことができるかどうかは完全には分かりません。春の統合SFTP - ローカルで削除されたファイルをredowloadしない

転送されているファイルが大きく、ローカルタスクによって処理された後、削除することができます。

しかし、SFTPは(実行時または再起動時に)それらが削除され、再ダウンロードされたことを認識しています。

私は既に再起動を生き残るためにSftpPersistentAcceptOnceFileListFilterを使用しています。

上記の説明では、ファイルをフィルタリングしてから を検索しています。ファイルが取り出されると、ファイルシステム上のファイルに追加のフィルタ が適用されます。既定では、これは AcceptOnceFileListFilterであり、説明したように というメモリに状態を保持し、ファイルの変更時刻は考慮しません。 アプリケーションが処理後にファイルを削除しない限り、アダプタはアプリケーションの再起動後にデフォルトでディスク上のファイルを 再処理します。あなたが FtpPersistentAcceptOnceFileListFilterを使用するフィルタ、およびリモートのファイルのタイムスタンプ 変更を設定している場合

また、(それが再フェッチさせる)、デフォルトのローカルフィルタが この新しいファイルを処理することはできません。

local-filter属性を使用して、ローカルの ファイルシステムフィルタの動作を構成します。これらの特定の使用例を解決するには、代わりに FileSystemPersistentAcceptOnceFileListFilterをローカルフィルタ として使用できます。このフィルタは、戦略(セクション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

はい。リモートとローカルのフィルタは独立しています。永続的な(リモートの) 'フィルタ 'がまだダウンロードされていないファイルを検出した場合、またはリモートサーバのタイムスタンプが変更された場合はダウンロードされます。 Redisをメタデータストアに使用している場合は、 'redis-cli'と' monitor'を使ってリアルタイムでアップデートを見ることができます。 –

+0

それは理にかなっています、Garry。私はconfigで自分の質問を更新しました - そして、ファイルがローカルで削除された後にまだredownloadedされていることをダブルチェックしました。 –

関連する問題