0

キューをリッスンする MDB があります。メッセージを受信するたびに、多くのロジック、更新などを持つステートレス セッション Bean に実行を転送します。ロジック/呼び出しチェーンの流れは次のとおりです。

キュー -> mdb -> セッション Bean -> セッション Bean -> 電子メール -> ロギング

最終的な結果は、電子メールとその後のログです。

デフォルトでは、MDB トランザクションはコンテナーによって管理され、タイムアウトは 30 秒です。

ただし、タイムアウトに達すると、タイムアウト例外がスローされ、メッセージが再試行されますが、ネストされたトランザクションとそのプロセスは (セッション Bean から) ロールバックされません。その結果、再試行のために複数の電子メールが送信されますが、MDB 自体からログに記録されたものを除いて、すべてのログが (セッション Bean から) ロールバックされます。

MDB ログ、特に電子メールを含む MDB ロールバックから呼び出されるすべてのトランザクションをすべきではありませんか?

セッション Bean はすべて、デフォルトのトランザクション タイプが「必須」になっています。

また、TransactionManagement タイプを CONTAINER として、TransactionType を REQUIRED として明示的に設定しました。メールはまだ出ます。セッション Bean からのロギングはロールバックしますが、再試行が発生します。

次に、TransactionType を REQUIRES_NEW に設定します。メールはまだ出ます。セッション Bean からのロギングはロールバックしますが、再試行は行われません。

MDB によって開始されたトランザクション全体と、MDB から呼び出されたすべてのトランザクションがロールバックされ、再試行が行われるようにするには、どのような設定をすればよいですか?

失敗時に再試行したいので、Bean 管理のトランザクションを使用したくありません。

私のアプリケーション サーバーは、ejb 3 仕様の weblogic 10.3 です。

4

1 に答える 1

0

電子メールリソースはトランザクションではないため、mdbタイムアウトを破棄し、電子メール送信者に電子メール転送タイムアウトに依存させます。その時点で、TXセットロールバックのみを呼び出します。txはロールバックし、メッセージは再配信され、再試行が成功した場合にのみ電子メールを送信できます。電子メール転送タイムアウトの結果は決定論的ではない場合があります。

于 2011-08-05T21:52:12.043 に答える