2

sftp:inbound-channel-adapterリモート フォルダーからローカル フォルダーにファイルを同期する があります。拡張子が .xml のファイルを見つけるMessage<File>と、新しいトランザクションを作成してrouterChannelチャネルに送信します。

approverRouterxml 内を調べて、プロセスを続行できるかどうかを判断します。すべてが正常であれば、メッセージは「okChannel」に送信され、保存のためにデータベースに送られます。ただし、問題が発生した場合、メッセージは にint:delayer10 秒間送信され、 に再送信されapproverRouterます。

トランザクションが成功または失敗した場合は、ダウンロードしたファイルを完了/失敗フォルダーに移動するだけですsftpCommittedChannelsftpRolledBackChannel

これを説明する xml を次に示します。

<int-sftp:inbound-channel-adapter id="..." channel="routerChannel" local-filter="localOnlyXmlFilter" ... >
    <int:poller fixed-rate="10000" max-messages-per-poll="-1">
        <int:transactional transaction-manager="transactionManager" synchronization-factory="syncFactory" />
    </int:poller>
</int-sftp:inbound-channel-adapter>

<!-- Takes Message<Map> makes sure all files exist and are valid MD5 checked -->
<int:router input-channel="routerChannel" ref="approverRouter" method="resolveRoute"/>

<bean id="approverRouter" class="com.example.app.readers.ApproverRouter">
    <property name="errorChannel" value="errorChannel"/>
    <property name="retryChannel" value="myRetry"/>
    <property name="okChannel" value="transformHashesToList"/>
    <property name="timeout" value="${timout}"/>
</bean>

<int:delayer id="delayer" input-channel="myRetry" output-channel="routerChannel" default-delay="10000"/>

<int:transaction-synchronization-factory id="syncFactory">
    <int:after-commit channel="sftpCommittedChannel"/>
    <int:after-rollback channel="sftpRolledBackChannel"/>
</int:transaction-synchronization-factory>

私の問題は、メッセージが遅延器に送信されると、ポーラーで作成されたトランザクションが正常に完了することです。これは、メッセージがint:delayer(retryChannel 経由で) に到着したときに、同じ元のスレッドに存在しなくなったためだと思います。

必要なのは、遅延を追加するがメッセージを元のトランザクション内に保持する同期遅延器であると思います。これは私の設計が正しくないように感じます。

再試行の遅​​延を作成し、成功または失敗時に sftp フォルダーを整理するために、通常の人は何をしますか。

4

1 に答える 1

0

ステートレス リクエスト ハンドラの再試行アドバイスを追加できます。スレッドは、バックオフ設定に基づいて中断できます。

ドキュメントspring-retryを参照してください。

于 2015-09-16T17:23:19.853 に答える