0

ファイルをリモートパスからローカルにプールし、いくつかのジョブを処理してから、ローカルファイルとリモートファイルの両方を削除するように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" />

ここでは、ファイルがリモートからローカルに転送されたときに、サービス アクティベーターが呼び出されます。

Service Activator がジョブを完了したときにローカル ファイルを削除するように構成するにはどうすればよいですか?

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

<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>
4

1 に答える 1

3

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

すでに疑似トランザクションを使用しており、ポーラー スレッドですべてを実行しているため、after-commit-expression.

request-handler-adviceもう 1 つの手法は、最終消費者 (この場合はサービス アクティベーター) にa を追加することです。これは、retry-and-moreサンプル アプリで示されています。

編集:

以下のコメントに応えて; いいえ、SpEL で 2 つのことを行うことはできません - ただし、使用することはできます

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

postProcessチャネルの下流の流れでやりたいことを何でもします。

ただし、成功と失敗の両方でフィルターからファイルを削除する理由は明確ではありませんAcceptAllFileListFilter。代わりにを使用する必要があります。

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

于 2016-03-27T14:49:23.363 に答える