2016-03-27 13 views
0

ファイルをリモートパスからローカルにプールし、一部のジョブを処理し、ローカルファイル&を両方とも削除するように春SFTPを設定しました。コンフィギュレーション以下Spring SFTPインバウンドシャネルアダプタローカルファイルを削除

削除ローカルファイルを除いて、正常に動作したファイルは、リモートから転送されたとき、私は、ここでdelete-remote-files="true"

<bean id="sftpSessionFactory" 
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory" 
    p:host="${sftp.host}" 
    p:port="${sftp.port}" 
    p:user="${sftp.username}" 
    p:password="${sftp.password}" 
    p:allowUnknownKeys="${sftp.allowUnknownKeys}" /> 

<int:channel id="sftpChannel"> 
    <int:queue /> 
</int:channel> 

<int-sftp:inbound-channel-adapter 
    id="sftpInboundAdapter" 
    channel="sftpChannel" 
    session-factory="sftpSessionFactory" 
    remote-directory="${sftp.remotedir}" 
    local-directory="${sftp.localdir}" 
    auto-create-local-directory="true"  
    delete-remote-files="true" 
    filename-pattern="*.TXT"> 
</int-sftp:inbound-channel-adapter> 

<int:poller default="true" fixed-rate="${quartz.pick.repeatInterval}" max-messages-per-poll="${sftp.msg.per.poll}"> 
    <int:transactional synchronization-factory="syncFactory" /> 
</int:poller> 

<int:transaction-synchronization-factory id="syncFactory"> 
    <int:after-rollback expression="@acceptOnceFilter.remove(payload)"/> 
</int:transaction-synchronization-factory> 

<bean id="acceptOnceFilter" class="org.springframework.integration.file.filters.AcceptOnceFileListFilter"/> 

<int:service-activator input-channel="sftpChannel" ref="msgHandler" method="handleMessage"/> 

<bean id="transactionManager" class="org.springframework.integration.transaction.PseudoTransactionManager"/> 

<bean id="fileNameGenerator" class="org.springframework.integration.file.DefaultFileNameGenerator" /> 

のように、呼び出されたサービスの活性化因子をローカルファイルを削除する任意の構成を見つけられませんでしたローカルに。

サービスアクティベータがジョブを完了したときにローカルファイルを削除するように設定するにはどうすればよいですか?

EDIT:ペイロードは、両方のは、以下の変更で解決されているリモートとローカルから削除します。

<int:transaction-synchronization-factory id="syncFactory"> 
    <int:after-commit expression="payload.delete()" channel="nullChannel"/> 
    <int:after-rollback expression="@acceptOnceFilter.remove(payload)"/> 
</int:transaction-synchronization-factory> 

答えて

2

メッセージが流れに送られた後、インバウンドアダプタが(自分で)どんな行動を取ることはありません。ダウンストリームフロートポロジー(非同期ハンドオフなど)については何も知らない。リモートの削除は、ファイルがフェッチされた後、メッセージが送信される前に行われる。

すでに疑似トランザクションを使用していて、ポーラースレッドですべてを実行しているので、after-commit-expressionで削除を実行できます。

もう1つの方法は、最終消費者(あなたのケースではサービスアクティベータ)にrequest-handler-adviceを追加することです。これはthe retry-and-more sample appに示されています。

編集:以下のコメントに応えて

。いいえ、それはSpeIで2つの物事を行うことはできません - しかし、あなたは

<int:after-commit expression="payload" channel="postProcess"/> 

を使用することができますし、postProcessチャンネルの下流の流れにやりたいです。

しかし、成功と失敗の両方でファイルをフィルタから削除する理由はわかりません。ちょうどAcceptAllFileListFilterを使用してください。

ところで、あなたのacceptOnceFilterはどこにでも使用されていません - local-filter属性に設定するつもりでしたか?

+0

ありがとう、ゲイリー、あなたのソリューションを試してみましょう、表現の2つのタスクを実行する方法はありますか:1)ペイロードを削除し、2)acceptOnceFilterからペイロードを削除します。 – Rembo

+0

それは働いています、(1)ファイル削除は 'after-commit-expression'を使って解決されました。あなたはacceptOnceFilterからのペイロードの削除について言及できますか? – Rembo

+0

は、after-commit-expression = "payload.delete()と@ acceptOnceFilter.remove(payload)"で試行されました。 – Rembo

関連する問題