私は待ち行列で待機するMDBを持っています。メッセージを受け取るたびに、多くのロジックや更新などを持つステートレスセッションBeanに実行を転送します。ここでは、ロジック/コールチェーンの流れがあります。 >メール:bean-MDBトランザクションはタイムアウト時にメールをロールバックしません
queue-> mdb->セッションbean->セッション>ログ
は、最終的な結果は、電子メールとその後のログです。
デフォルトでは、MDBトランザクションはコンテナによって管理され、タイムアウトは30秒です。
ただし、タイムアウトになるとタイムアウト例外がスローされ、メッセージは再試行されますが、ネストされたトランザクションとそのプロセスは(セッションBeanから)ロールバックされません。その結果、再試行のために複数の電子メールが消えますが、すべてのログは(セッションBeanから)ロールバックされます。MDB自体からログに記録されたものを除いて
mdbを含むMDBロールバックからすべてのトランザクションを呼び出すべきではありませんロギング、特に電子メール?
セッションBeanのデフォルトのトランザクションタイプは「必須」です。
また、TransactionTypeをCONTAINERとして明示的にTransactionManagementタイプをREQUIREDとして設定しました。メールはまだ消えます。セッションBeanのロールバックからのロギングが再試行されます。
次に、TransactionTypeをREQUIRES_NEWとして設定します。メールはまだ消えます。セッションBeanのロールバックからログをとるが、DOESNTを再試行する。
MDBによって開始されたENTIREトランザクションとそれから呼び出されたすべてのトランザクションが確実にロールバックされ、再試行されるように設定するにはどうすればよいですか?
失敗した場合に再試行したいので、私はBean管理のトランザクションを使用したくありません。
私のアプリケーションサーバは、ejb 3 specのweblogic 10.3です。
あなたの言ったことを理解していません。私の問題は、電子メールが送信された後にスローされるMDBタイムアウトまたはその他の例外であるかどうか、dbテーブルへのロギングなどのトランザクション更新はロールバックされますが、電子メールはまだ消えます。この場合、メール転送のタイムアウトを設定すると、電子メールがどのように出ないのですか? – Jaizen
トランスポートのタイムアウトを設定すると、DBと実際の電子メールを同期して送信する可能性が最も高くなります。 MDBのタイムアウトを設定しても、電子メール送信に影響はありませんので、削除してください。あなたが輸送手段でタイムアウトを取ったとき、*おそらく電子メールはドアを出さなかったので、TXをロールバックします。電子メールトランスポートからハンドシェイクを取得した場合、電子メールはSMTPサーバーまで確実に送信されたので、TXをコミットします。電子メール送信を呼び出すと、例外が発生したときに実際にそれを出したかどうかを確かに知る決定的な方法は事実上ありません。 – Nicholas
ニコラス、そうです。私が知る限り、JavaMail APIメソッドを使ってメールが正常に送信されると、そのメールが外に出るのを防ぐ方法はありません。私は、XAリソースマネージャーを介してこれを処理する方法があると思って、コミットが発生した後にメールが送信されるようにしましたが、そこには運がありません。ありがとう。 – Jaizen