Cosminexus 機能解説
メソッドをキャンセルできる領域のことを非保護区,メソッドをキャンセルできない領域を保護区といいます。
保護区とは,メソッドキャンセルのできない領域です。保護区では,J2EEサーバの動作で共有されるデータや領域を保持したり,JavaVM内で行われる処理を保証したりするため,メソッドキャンセルができません。J2EEサービス,Webコンテナ,EJBコンテナが保護区に該当します。これらの保護区に該当するクラス以外で,保護区として扱いたいクラスがある場合は,保護区リストファイルに記述します。
一方,非保護区は,メソッドキャンセルができる領域です。J2EEアプリケーションが非保護区になります。
保護区,非保護区の判定は,クラス単位で行われます。ただし,非保護区の場合は実行時の条件によって保護区として扱われることがあります。J2EEアプリケーションでも,ネイティブメソッドを呼び出している場合や,スタティックイニシャライザを実行している場合は,保護区と判定されます。
メソッドキャンセルは,現在実行中の処理が非保護区の場合だけ実行されます。メソッドキャンセルができるかどうかを確認するため,保護区の判定では,キャンセル対象となるメソッドが非保護区で実行中かどうかを判定します。実行している処理が非保護区の場合は,メソッドキャンセルが行われます。保護区の場合は,一定間隔で保護区の判定をリトライします。一定時間内に非保護区に制御が移らない場合は,メソッドキャンセルが失敗したと見なされ,メソッドキャンセルの処理が終了します。保護区の判定処理の流れを次の図に示します。
図19-2 保護区の判定処理の流れ
なお,メソッドキャンセル時にデータベースにアクセスしている場合,トランザクションは強制的にタイムアウトします。トランザクションがタイムアウトすると,実行中のSQLをキャンセルし,トランザクションはロールバックにマークされます。また,保護区を実行中のためにメソッドキャンセルが行われなくても,トランザクションは強制的にタイムアウトします。このとき,トランザクションはロールバックにマークされます。トランザクションタイムアウトの詳細については,「9.11.8(2) トランザクションタイムアウト発生時のステートメントキャンセル」を参照してください。
メソッドキャンセルを実行すると,キャンセル対象となるメソッドを実行中のスレッドで,ThreadDeathが発生します。WebコンテナおよびEJBコンテナでは,このThreadDeathをキャッチして必要な処理を実施します。
WebコンテナおよびEJBコンテナでのメソッドキャンセル時の動作について説明します。
(a) Webコンテナでの動作
ThreadDeathがスローされるタイミングによって動作が異なります。
- Webアプリケーションのフィルタ/サーブレット/JSPでのリクエスト処理中にThreadDeathがスローされた場合
- 呼び出し元となるフィルタ/サーブレット/JSPにjavax.servlet.ServletExceptionがスローされます。
- 例えば,フィルタからjavax.servlet.FilterChainのdoFilterメソッド呼び出しの延長でサーブレットが実行され,そのサーブレットの実行中にThreadDeathが発生した場合,doFilterメソッドの呼び出しで,javax.servlet.ServletExceptionがスローされます。
- 同様に,javax.servlet.RequestDispatcherのforwardメソッド,またはincludeメソッドを呼び出して,リクエストをサーブレット/JSPに転送した場合,javax.servlet.ServletExceptionのgetRootCauseメソッドでは,ThreadDeathオブジェクトを返します。
- Webアプリケーションのリスナの処理中にThreadDeathがスローされた場合
- WebコンテナはThreadDeathをキャッチしますが,リスナが呼び出される契機となったイベントの発生元となるユーザプログラム処理に対しては,例外はスローされません。
- 例えば,javax.servlet.http.HttpServletRequestのgetSessionメソッドの呼び出しによってHttpSessionを作成した場合,javax.servlet.http.HttpSessionListenerのsessionCreatedメソッドが呼び出されます。このsessionCreatedメソッドの実行中にThreadDeathがスローされた場合,WebコンテナはスローされたThreadDeathをキャッチしますが,HttpSession生成のイベントを発生させたgetSessionメソッド呼び出しには例外をスローしません。
(b) EJBコンテナでの動作
EJBのメソッド呼び出し中にThreadDeathがスローされた場合は,EJB仕様で定められたシステム例外が発生した場合と同等の動作をします。呼び出し元に返る例外のgetCauseメソッドでは,ThreadDeathオブジェクトを返します。
メソッドキャンセル実行のタイミング,およびメソッドキャンセル実行までに掛かる最大の時間について説明します。
- タイムアウト発生時
メソッドタイムアウト時のメソッドキャンセルのモードとして,スレッドを停止することが設定されている場合,タイムアウト発生時にメソッドキャンセルが実行されます。メッセージを出力するだけの設定の場合は,タイムアウト時でもメソッドキャンセルは実行されません。
タイムアウトが発生したメソッドのキャンセル処理は,一定の間隔で実行されます。また,メソッドキャンセルの処理は,動作中のリクエスト処理がタイムアウトしていないかを調査する(タイムアウトを監視する)スレッドとは別のスレッドで,非同期で実行されます。そのため,タイムアウトの検知後にメソッドキャンセルが実行されるまでには,最大で,メソッドキャンセル処理の時間間隔分掛かります。
メソッドキャンセル処理の時間間隔は,タイムアウトを監視する時間間隔と同じです。メソッドキャンセル処理の時間間隔の設定については,マニュアル「Cosminexus システム構築ガイド」のJ2EEアプリケーション実行時間の監視の設定に関する説明を参照してください。
- メソッドキャンセルコマンドの実行時
運用中にメソッドキャンセルコマンドを実行すると,メソッドキャンセルが実行されます。
メソッドキャンセルコマンドは,タイムアウトが発生したメソッドを実行中のスレッドの状態を確認して,メソッドキャンセルが実行できることを確認してから,必要に応じて実行します。
メソッドキャンセルを実行するための手順については,マニュアル「Cosminexus システム運用ガイド」の,J2EEアプリケーションの実行時間の監視とキャンセルの説明を参照してください。
メソッドキャンセル処理は,コマンド実行後に非同期に実行されます。また,メソッドキャンセル処理は,メソッドキャンセル処理の時間間隔には影響されません。
- J2EEアプリケーション強制停止の実行時
J2EEアプリケーションを強制停止した場合に,停止対象となるJ2EEアプリケーションで実行中のスレッドがあるときは,メソッドキャンセルが実施されます。
アプリケーションの強制停止については,「19.5 J2EEアプリケーションの停止」を参照してください。
メソッドキャンセル処理は,コマンド実行後に非同期で実行されます。また,メソッドキャンセル処理は,メソッドキャンセル処理の時間間隔には影響されません。
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.