2017-06-23 7 views
1

リモートFTPにファイルがあります。たとえば、 "abc.txt"です。このファイルは1分ごとに更新されます。同じファイルを1分ごとに取得するようにFTP Inbound Channel Adapterを設定しました。Spring統合の古いローカルファイルを置き換える方法FTPインバウンドチャネルアダプタ

これは初めて正常に動作します(つまり、ローカルディレクトリはまだ空です)。ただし、2回目以降の中間ファイルabc.txt.writingは、元のabc.txtファイルを置き換えることはできません。つまり、abc.txt(旧バージョン)とabc.txt.writingの両方が同じディレクトリに共存することになります。 (新しいバージョンのデータ)。 (エラープロンプトなし)

私はバグを打つか、古いバージョンのファイルを最初に削除してabc.txt.writingが正常に名前を変更できるようにパラメータを設定する必要があります。 FileWritingMessageHandler

<bean id="ftpSessionFactory" 
     class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory" 
     p:host="127.0.0.1" 
     p:port="21" 
     p:username="myusername" 
     p:password="mypassword"> 

<bean id="cachingSessionFactory" class="org.springframework.integration.file.remote.session.CachingSessionFactory"> 
     <constructor-arg ref="ftpSessionFactory" /> 
     <constructor-arg value="1" /> 
     <property name="sessionWaitTimeout" value="1000" /> 
</bean> 

<int-ftp:inbound-channel-adapter id="myChannel" 
            channel="nullChannel" 
            session-factory="cachingSessionFactory" 
            filename-pattern="abc.txt" 
            remote-directory="/" 
            preserve-timestamp="true" 
            local-directory="c:/temp"> 
    <int:poller cron="15 * * * * ?" max-messages-per-poll="1" /> 
</int-ftp:inbound-channel-adapter> 



c:\temp> dir /a 
06/23/2017 11:44 AM   840,000 abc.txt 
06/23/2017 11:45 AM   840,000 abc.txt.writing 
+0

'int-ftp:inbound-channel-adapter'の代わりに' int-ftp:outbound-channel-adapter'を使うのはどうですか? 'int-ftp:outbound-channel-adapter'には、あなたが望むものを得るための' mode = "REPLACE"という属性があります。条件は、バネ統合バージョン4.1以上を使用する必要があるということです。 –

+0

SI 4.3.10を使用しています。私はFTPからファイルをダウンロードして、下流のコンポーネントでローカルに処理しています(上記のコードスニペットで下流コンポーネントのプロセスコードを投稿しませんでした)。この場合、FTP Outbound Channel Adapterは役に立ちません。 – user3544765

+0

おそらく、下流のコードが古いファイルを使用中のままにしているため、名前の変更操作が成功しない可能性があります。また、そのダウンストリーム処理でファイルを削除することもできます。 –

答えて

1

は、デフォルトではfalseあるdeleteSourceFilesオプションがあります。これは、<int-file:outbound-channel-adapter>を使用する場合です。

どういうわけか他の方法でローカルファイルを処理するとします。 <service-activator>、あなたはExpressionEvaluatingRequestHandlerAdviceを使用し、成功時にFile.delete()を実行するために検討する必要があります。

<int:request-handler-advice-chain> 
     <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice"> 
      <property name="onSuccessExpressionString" value="payload.delete()"/> 
     </bean> 
    </int:request-handler-advice-chain> 

その​​が正確<int-ftp:inbound-channel-adapter>の結果としてFile地元であるところ。

+0

結論として、私は処理後にダウンロードしたファイルを削除しなければならないというGaryの助言を意味します。私が前にこれを試していなかった理由は、ローカルフィルタにFileSystemPersistentAcceptOnceFileListFilterを使用していることです。処理後にファイルを削除するように強制するのではなく、古いファイルをローカルディレクトリに保存する必要があります。 – user3544765

+0

フィルタとディレクトリは関連するプレーヤーではありません。ファイルをフィルタリングするには、ディレクトリは必要ありません。しかし、ファイルをファイルシステムに保存しないと、ファイルを操作することはできません。あなたは、 'local-filename-generator-expression'を使って、あるbeanの既存のファイルを使って何かをすることを考えているかもしれません。 –

+0

しかし、実際のファイル名が既に存在する場合は、中間の.writingファイルが実際のファイル名に戻されなかった場合、SI FTP Inboundチャネルアダプタは例外をスローします。現在のところ、名前変更アクション中にサイレントに失敗した場合、問題を特定することは容易ではありません。 – user3544765

関連する問題