私はIBM WebSphere Application Server 8で動作し、EJB 3.0ステートレスBeanを持つアプリケーションを持っています。このBeanは、EJB 2ステートレスBeanで構成されるサービスを呼び出します。 2番目のBeanはforループで呼び出されます。この手段は少なくとも300回呼ばれます。プロセスはトランザクションで行われます。 最初のBeanがそのようにマークされています60秒後にEJBリモート呼び出しがロールバックになる
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
秒豆:
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
時々、トランザクション全体が60秒以上かかります。このため、トランザクションのタイムアウトを600秒に設定しました。
totalTranLifetimeTimeout="600"
LPSHeuristicCompletion="ROLLBACK"
propogatedOrBMTTranLifetimeTimeout="600"
しかし、私はまだ原因と解決策が見つからなかった問題に遭遇しました。 最初の呼び出しから60秒後に、サービス(方法B)は、トランザクションのロールバック属性をtrueに設定します。メソッドは最後まで実行されますが、このためにデータベースには何も保存されません。すべてがロールバックされます。
コンポーネントをtrue(コンテナまたはデータベース)に設定する理由とその理由についての情報を得るための解決策が見つかりませんでした。
私はすべてのことを正しく説明し、どんなアイデアや解決策も高く評価されることを希望します。
ご返信ありがとうございます。 デプロイメント記述子またはサーバーのいずれかに「アプリケーションコンポーネントのトランザクションタイムアウト」が設定されていません。 一方、「Client Inactivity Timeout」は意味をなさない。しかし、それでも、両方のサーバーの値を120秒に変更しても、肯定的な結果は得られませんでした。 最初の投稿で述べたように、リモートejbはforループで呼び出され、最初の呼び出しから60秒後の最初の呼び出しでは、フラグはすでにtrueに設定されています。リモート呼び出しの開始時と終了時にSessionContext.getRollbackOnly()の値が記録されるため、これが表示されます。 –