1

Jboss 4.2.2にデプロイされたMDBと、メッセージを生成し、メッセージが送信される前に作成された一時キューを介してMDBからの応答を期待する同じサーバー上のクライアントがあります。

クライアントを実行すると、メッセージが作成され、キューに入れられて応答を待機していることがわかります(これまでのところ問題ありません)...しかし、ログをチェックインすると、タイムアウトに達し、応答がないことがわかります受け取ります。タイムアウトが発生し、クライアントのメソッドが完了すると、MDBは、クライアントがメッセージをキューに入れた瞬間に処理されるべきであったメッセージの処理を開始します。このタイミングの問題の結果として、MDBが一時キューに応答しようとすると、クライアントがすでになくなっているため失敗します。

リモートサーバーから同じクライアントを実行している場合、問題はありません... MDBはキューからメッセージをすぐに取得し、クライアントは処理が完了した直後に応答を受信します。

コンテナ管理のトランザクションを使用しています。それはそれと関係があるのではないかと思います...クライアントの「メッセージの送信/応答の受信」は、メッセージをキューに入れることをコミットする前に、すべてトランザクションと見なされる可能性があります...しかし、正解です。この場合、リモートクライアントから同じ動作が見られなかったのはなぜですか?クライアント管理のトランザクションはデフォルト設定であり、それが私のリモートサーバーが使用していたものですか?

これを修正する方法はありますか?

前もって感謝します!PJ

4

1 に答える 1

1

ここには2つの問題があるようです。1 つ目は、要求メッセージが送信時にコミットされておらず、おそらく受信呼び出しと同じ作業単位にあることです。お気づきのように、ここで重要なのは、リモートで動作が変化する理由を判断することです。または、送信されたメッセージを明示的にコミットします。

2 つ目の問題は、タイムアウトに達するとメッセージが最終的にコミットされることです。最初の問題を修正すると、これは潜在的な問題になり、修正されたように見えますが、後で戻ってきます。動作は、トランスポート プロバイダーがこれを例外と見なすかどうかによって異なります。理想的には、タイムアウトは例外と見なされ、トランザクションはロールバックされます。リクエストメッセージの送信を処理できると仮定すると、タイムアウトの対象となる唯一のトランザクションは応答の受信です.タイムアウトやその他の例外の後にコミットされることは 絶対に望ましくありません.

申し訳ありませんが、これ以上決定的な答えはありません。受け入れるが、受信時のトランザクション境界に注意する人のために、受け入れを保存してください。

于 2010-04-27T00:15:19.890 に答える