2016-09-15 4 views
1

は、私は次の操作を実行しようとすると、アカウントがbothsののLUWにダイレクトメッセージチャネルが、それでも楽観的ロックの例外を取得

に更新されたaccountIdとSomeLUW、AnotherLUW(作品の論理ユニット)、を持つアカウントを考える:

SomeLUW luw1 = new SomeLUW(accountId); 
messagingTemplate.send(channel1, new GenericMessage<>(luw1)); 

AnotherLUW luw2 = new AnotherLUW (accountId); 
messagingTemplate.send(channel2, new GenericMessage<>(luw2)); 

時には、オプティミスティックロック例外が発生することがあります。典型的な(

MessageChannels.direct() 
    .datatype(AnotherLUW.class) 
    .get(); 
MessageChannels.direct() 
    .datatype(RedemptionLUW.class) 
    .get(); 

とログで、私は一つのスレッドだけを見つけることができます。それができる理由 が、私は理解していない、私はそれは私が直接のチャネルを使用しているため

順次処理であると仮定したいですSI DefaultMessageListenerContainer-1

私が持っているのErrorHandler JMSブローカーの再配信になりますが、ログは例外で汚染されている

これがなぜこのように考えられますか?

答えて

0

あなたのプロセスはDefaultMessageListenerContainerから開始されているので、実際にはいくつかのメッセージがそこから別のスレッドで処理されていることがあります。したがって、並行して。

右:逐次処理ですが、すべてが同じスレッドで行われている場合。

DefaultLockRegistryを使用して、リソースへの相互アクセスを確保することを検討してください。あなたの場合はJPAだと思います。

+0

どのようにDefaultLockRegistryを使用できますか?私は例を見つけようとしていますが、見つけられませんでした –

+0

https://github.com/spring-projects/spring-integration/blob/master/spring-integration-core/src/を見ることができますテスト/ java/org/springframework/integration/support/locks/DefaultLockRegistryTests.java。しかし一般的な目的は、いくつかの 'key'でレジストリからロックを取得し、プロセス中ロックし、最後にロックを解除します。異なるキーに対してブロックされていない違いのみ。 –

関連する問題