EJB に関する質問:
無限ループを持つセッション Bean があるとします。EJB トランザクションで実行されています。EJB のトランザクションがタイムアウトすると、無限ループ スレッドが中断するか、コンテナが無限ループを実行しているスレッドを停止します。
EJB に関する質問:
無限ループを持つセッション Bean があるとします。EJB トランザクションで実行されています。EJB のトランザクションがタイムアウトすると、無限ループ スレッドが中断するか、コンテナが無限ループを実行しているスレッドを停止します。
EJB のトランザクションがタイムアウトすると、無限ループ スレッドが中断するか、コンテナが無限ループを実行しているスレッドを停止します。
この回答は、私が数年前に OC4J 10.3.x、WebSphere 6.x、および WebLogic 10.x で実行したリバース エンジニアリングに基づいており、同様の方法で他のコンテナーにも適用できる可能性があります。私が覚えている限りでは、トランザクション タイムアウト検出はコンテナーごとに異なる方法で実装されていますが、それらはすべて、次のような特定の共通の原則を採用しています。
XAResource
インスタンス) と対話して何らかの作業 (たとえば、SQL クエリの発行) を行おうとすると、コンテナーは、トランザクションがトランザクションとしてマークされていると判断します。ロールバックし、TransactionRolledBackException
.TransactionRolledBackException
以上のことから、 aを投げない限り無限ループは破られないと推測できます。つまり、ループ内でトランザクション アクティビティが試行された場合にのみ、ループが中断されます。そのようなアクティビティが実行されない場合、ループはそのプロパティを無期限に保持します。
WebLogic などの特定のコンテナーでは、「スタック」スレッドを検出できることに注意してください。これは、そのようなコンテナーが、構成された期間を超えて長時間にわたってスレッドが実行されているかどうかを検出する機能を備えていることを意味します。これは、コンテナーがスレッドのスタックを検出したときにスレッドを終了または中断するという意味ではありません。
いいえ、通常、コンテナが無限ループを自動的に検出することはできません。一部のアプリケーションサーバーは、トランザクションがタイムアウトしたこと、またはEJBが長時間アクティブになったことを検出する場合があります。