3

EJB に関する質問:

無限ループを持つセッション Bean があるとします。EJB トランザクションで実行されています。EJB のトランザクションがタイムアウトすると、無限ループ スレッドが中断するか、コンテナが無限ループを実行しているスレッドを停止します。

4

2 に答える 2

8

EJB のトランザクションがタイムアウトすると、無限ループ スレッドが中断するか、コンテナが無限ループを実行しているスレッドを停止します。

この回答は、私が数年前に OC4J 10.3.x、WebSphere 6.x、および WebLogic 10.x で実行したリバース エンジニアリングに基づいており、同様の方法で他のコンテナーにも適用できる可能性があります。私が覚えている限りでは、トランザクション タイムアウト検出はコンテナーごとに異なる方法で実装されていますが、それらはすべて、次のような特定の共通の原則を採用しています。

  • 通常、トランザクション タイムアウトの検出は、コンテナーによって管理される別のスレッドで実行されます。関連するスレッドは、指定された期間 (通常は 1 秒) スリープ状態になり、その後ウェイクアップして、進行中のすべてのトランザクションを反復処理します。いずれかのトランザクションが指定されたタイムアウトを超えた場合 (通常、さまざまなレベル - JTA コンテナー、EJB など)、スレッドはトランザクションにロールバックのマークを付けます。トランザクションの状態について、トランザクションを実行しているスレッドに通知する試みは行われません。
  • トランザクションを実行するスレッドが JTA コーディネーターまたはトランザクション リソース (XAResourceインスタンス) と対話して何らかの作業 (たとえば、SQL クエリの発行) を行おうとすると、コンテナーは、トランザクションがトランザクションとしてマークされていると判断します。ロールバックし、TransactionRolledBackException.

TransactionRolledBackException以上のことから、 aを投げない限り無限ループは破られないと推測できます。つまり、ループ内でトランザクション アクティビティが試行された場合にのみ、ループが中断されます。そのようなアクティビティが実行されない場合、ループはそのプロパティを無期限に保持します。

WebLogic などの特定のコンテナーでは、「スタック」スレッドを検出できることに注意してください。これは、そのようなコンテナーが、構成された期間を超えて長時間にわたってスレッドが実行されているかどうかを検出する機能を備えていることを意味します。これは、コンテナーがスレッドのスタックを検出したときにスレッドを終了または中断するという意味ではありません。

于 2011-07-11T08:26:53.357 に答える
1

いいえ、通常、コンテナが無限ループを自動的に検出することはできません。一部のアプリケーションサーバーは、トランザクションがタイムアウトしたこと、またはEJBが長時間アクティブになったことを検出する場合があります。

于 2011-07-08T13:47:19.103 に答える