私はSpring Integrationを使用してJMSからメッセージを読み取り、処理して戻り値のvoidを持つ独自のdbPersistorのpersistメソッドを使用してデータベースに保持します。私は、JMSに公開されたメッセージがdbに正常に保持されていることを検証するためのテストケースを書きました。このテストのために次のように私のSIおよびJMS構成がある -Spring統合:JMSからの読み取り - >メッセージの処理 - > DB内での持続
<int:poller fixed-delay="500" default="true"/>
<int:channel id="inputChannel">
<int:queue/>
</int:channel>
<int:channel id="errorChannel">
<int:queue/>
</int:channel>
<jms:message-driven-channel-adapter id="jmsInboudAdapter"
connection-factory="connectionFactory" destination-name="MessageQueue"
channel="inputChannel" error-channel="errorChannel" transaction-manager="dbTxManager"
acknowledge="transacted"/>
<int:chain id="handlerChain" input-channel="inputChannel">
<int:service-activator ref="jmsMessageHandler" method="handleMessage" />
<int:service-activator ref="dbPersistor" method="persist" />
</int:chain>
その後、私は次の操作を行うテストで -
- jmsTemplate.send()
- verifyMessageWasPersistedToDB
この私はちょうど1つのメッセージをdbに公開するとうまくいく。しかし、複数のメッセージを公開するためにjmsTemplate.send()をループすると、メインスレッドはSIスレッドがまだ実行されている間に操作を完了し、DB内のメッセージを検証しようとし、メッセージの一部がまだ永続化されていないため失敗します。私の質問は -
- メインスレッドがSIスレッドが終了してからverifyメソッドを呼び出すのを待つようにするにはどうすればよいですか?
- db例外とロールバックの場合、失敗したメッセージが元のキューに戻ってきたことを確認するにはどうすればよいですか?
おかげ AJ
感謝のGary、 'inputChannel'を' DirectChannel'に変更すると、トランザクション管理の問題を解決するのに役立ちました。これで、失敗したメッセージはバックエンドメッセージストアに残ります。 しかし私の最初の質問はまだありません - メインスレッドが残りのコードの実行に進む前にSIチェーンが終了するのを待たせるにはどうしたらいいですか?現在は、メインスレッドの残りのコードを呼び出す前に 'Thread.sleep()'を使用しています。 –
私が#2で言ったように、テストスレッドを「簡単に」待つことはできません。フローに追加のコンポーネントを組み込む必要があります。予想される結果が表示されるまで(または時間制限が満了して、テストが失敗したことを示すまで)DBをポーリングし続けるほうが簡単です。 –
私はあなたのポイントを得る。フロー内にCountDownLatchを追加する方法について説明します。すべての返信と説明ゲーリーありがとう! –