3

実際、JBoss はメッセージを送信しますが、それは EJB によって開始された現在のトランザクションが終了したときだけです。

JBoss 4.0.3 と Spring の JmsTemplate でこの問題が発生します。EJB は、reply_to フィールドとして一時キューを持つキューにメッセージを送信します。次に、同じトランザクション内で、最初の MDB からの応答をリッスンします。問題は、トランザクションが終了した後に JmsTemplate のメソッド「send」が実行されないことです。そのため、メッセージがキューに送信され、MDB によって処理されるまでに、一時キューのリスナーはなくなります。

これを「同期受信」といいます

2 つのことがこの動作を変更しますが、いくつかの懸念が生じます。

  1. EJB のトランザクション タイプを BMT に変更します。(懸念事項:BMTは最悪)

  2. JmsTemplate.send() メソッドを呼び出すだけのスレッドを作成します。

補足として、これは weblogic 環境で正しく動作している EJB であり、メッセージはトランザクションの終了時ではなくトランザクションの途中で、送信されるべきときに送信されます。

助けてくれてありがとう。

4

2 に答える 2

1

JBoss の動作は正しいです。JMS はトランザクション API であり、送信は tx がコミットされたときにのみ実行する必要があります。

JmsTemplate が現在のトランザクション コンテキストを使用しないように説得することは可能かもしれませんが、JMS API の不愉快さをあなたから隠そうとすることは重要です。

于 2009-06-22T09:35:47.487 に答える
0

REQUIRES_NEW のトランザクション伝搬を使用する、Spring のトランザクション管理を使用するステートレス セッション Bean またはサービス メソッドのいずれかのコードで JMS テンプレートをラップできます。そうすれば、メッセージの送信は、ラッピング トランザクションの範囲外でメッセージの送信をコミットする独自のトランザクション内で行われます。

ただし、なぜこれが Weblogic で機能するのかはわかりません。私の推測では、Weblogic ではキューが XA Queue として認識されていません。

于 2009-11-05T16:10:05.003 に答える