sftp:inbound-channel-adapter
リモート フォルダーからローカル フォルダーにファイルを同期する があります。拡張子が .xml のファイルを見つけるMessage<File>
と、新しいトランザクションを作成してrouterChannel
チャネルに送信します。
はapproverRouter
xml 内を調べて、プロセスを続行できるかどうかを判断します。すべてが正常であれば、メッセージは「okChannel」に送信され、保存のためにデータベースに送られます。ただし、問題が発生した場合、メッセージは にint:delayer
10 秒間送信され、 に再送信されapproverRouter
ます。
トランザクションが成功または失敗した場合は、ダウンロードしたファイルを完了/失敗フォルダーに移動するだけですsftpCommittedChannel
。sftpRolledBackChannel
これを説明する 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 フォルダーを整理するために、通常の人は何をしますか。