2.12.6 EJBタイマとコールバックの動作
次の場合のEJBタイマの動作およびコールバックの動作について説明します。
-
EJBタイマに過去の時刻が指定された場合
-
一つのEnterprise Beanのクラスで複数のEJBタイマを設定している場合
-
タイムアウト時に,前回のコールバックが終了していない場合
-
複数スレッドからEJBタイマキャンセルが呼ばれた場合
-
コールバック実行中にEJBタイマキャンセルが呼ばれた場合
-
コールバック時に,EJBタイマキャンセルを行った未決着トランザクションがある場合
- 〈この項の構成〉
(1) EJBタイマに過去の時刻が指定された場合
タイマの種類によって動作が異なります。
(a) single-eventタイマまたはintervalタイマの場合
EJBタイマに過去の時刻が指定された場合,single-eventタイマのときはEJBタイマの生成直後に1回タイムアウトメソッドをコールバックします。intervalタイマの場合は,EJBタイマ生成後の時刻に発生するタイムアウト時にタイムアウトメソッドをコールバックします。EJBタイマに過去の時刻が指定された場合の動作を次の図に示します。
- single-eventタイマの場合
-
2:00にタイムアウトが発生するsingle-eventタイマが,すでにタイムアウトの時刻を過ぎた4:15に生成された場合,生成直後に1回タイムアウトメソッドをコールバックします。
- intervalタイマの場合
-
2:00から2時間間隔でタイムアウトが発生するintervalタイマが,すでにタイムアウトの時刻を過ぎた4:15に生成された場合,それ以降の時刻に発生するタイムアウト時(1回目は6:00)にタイムアウトメソッドをコールバックします。
(b) calendar-basedタイマの場合
カレンダー形式で過去の日時を指定した場合,または日時として不正な値(2/31など)を指定した場合などの動作を次に示します。
-
APIで生成するタイマに過去の日時を指定した場合
アプリケーションは開始しますが,タイマは生成されないで,KDJE43206-Wメッセージが出力されます。
-
アノテーションで生成するタイマに過去の日時を指定した場合
アプリケーションは開始しますが,タイマは生成されないで,KDJE43220-Wメッセージが出力されます。
-
タイマに日時として不正な値(2/31など)を指定した場合
アプリケーションは開始しますが,タイマは生成されません。
-
期限が過ぎる直前のTimerオブジェクトでgetNextTimeoutメソッドを呼び出した場合
getNextTimeoutメソッドを呼び出したときにKDJE43211-Wが出力されます。
(2) 一つのEnterprise Beanのクラスで複数のEJBタイマを設定している場合
一つのEnterprise Beanクラスに対して,複数のEJBタイマがある場合に,それらの複数のEJBタイマのコールバックが重なったときは,コールバック処理が並列に行われます。ただし,並列に処理できるコールバックスレッドやEnterprise Beanインスタンスがある場合に限ります。このようなコールバックスレッドやインスタンスがない場合は,スレッドやインスタンスが解放されるまで待ちます。
(3) タイムアウト時に,前回のコールバックが終了していない場合
一つのEJBタイマで同時に実行できるコールバックは一つだけです。タイムアウトメソッドの処理は,処理内容によっては時間が長く掛かることがあります。そのため,intervalタイマの場合,コールバック処理の実行中に次のタイムアウトの時刻を過ぎてしまい,一つのコールバックが完了するまでに複数のタイムアウト時刻を経過することがあります。この場合,タイムアウトの時刻どおりに実行されなかったコールバック処理は行わないで,前回のコールバックが終了した時刻よりあとに発生するタイムアウトのコールバック処理を行います。
コールバック時に,前回のコールバックが終了していない場合の動作を次の図に示します。
この図の場合,1分間隔でタイムアウトが発生してコールバック処理を実行する設定にしています。1回目のコールバックの処理中に,2回目と3回目のタイムアウトの時刻を過ぎてしまった場合,1回目のコールバック処理が終了したあとの,次のタイムアウト時刻(予定では4回目のタイムアウトの時刻)に2回目のコールバック処理を行います。タイムアウト時刻を過ぎてしまった2回分のコールバック処理は行われません。
(4) 複数スレッドからEJBタイマキャンセルが呼ばれた場合
同時に複数のスレッドから,同一EJBタイマのEJBタイマキャンセルメソッドが呼ばれた場合,キャンセルの処理は順次行われます。
ただし,トランザクション管理下でEJBタイマキャンセルが行われた場合,トランザクションが決着するまでは,EJBタイマが削除されるかどうかを確定できません。そのため,そのほかのスレッドが同じEJBタイマのキャンセルを行うと,排他待ちとなります。
同時に複数のスレッドから,同一のEJBタイマのキャンセルが呼ばれた場合の動作を次の図に示します。
(5) コールバック実行中にEJBタイマキャンセルが呼ばれた場合
EJBタイマのキャンセル時に,タイムアウトメソッドのコールバックが実行中の場合,次のような動作になります。
-
EJBタイマキャンセルメソッドの呼び出しは正常終了します。
-
タイムアウトメソッドのコールバック処理は継続して実行されますが,コールバック完了後に次の動作をします。
-
タイムアウトメソッドがCMTのトランザクションを使用している場合,そのトランザクションはロールバックされます。
-
タイムアウトメソッドがCMTのトランザクションを使用していない場合,コールバック中に行われたトランザクションの決着には関与しません。
-
-
通常ではコールバックをリトライする次のケースで終了した場合でも,リトライしません。
-
CMTのトランザクションがロールバックされた場合
-
非検査例外がスローされた場合
-
-
コールバック完了時に,メッセージログにメッセージが出力されます。
-
タイムアウトメソッドがCMTのトランザクションを使用している場合,KDJE43161-Wが出力されます。
-
タイムアウトメソッドがCMTのトランザクションを使用していない場合は,KDJE43160-Wが出力されます。
-
-
CMTのトランザクションを使用するタイムアウトメソッドのコールバック実行中に,別のトランザクションからEJBタイマキャンセルが行われた場合と,CMTのトランザクションを使用するタイムアウトメソッドの中でEJBタイマキャンセルが行われた場合では動作が異なります。
-
CMTのトランザクションを使用するタイムアウトメソッドのコールバック実行中に,別のトランザクションからEJBタイマキャンセルが行われた場合の動作を次の図に示します。
図2‒29 コールバック実行中のキャンセル -
CMTトランザクションを使用するタイムアウトメソッドの中でEJBタイマキャンセルが行われた場合の動作を次の図に示します。
図2‒30 タイムアウトメソッドでのEJBタイマキャンセル この図の場合,実際にEJBタイマがキャンセルされるのは,タイムアウトメソッド完了後です。このため,トランザクションがコミットした場合,EJBタイマはキャンセルされます。トランザクションがロールバックした場合,EJBタイマは存続します。
-
(6) コールバック時に,EJBタイマキャンセルを行った未決着トランザクションがある場合
EJBタイマキャンセルを行った未決着のトランザクションAが存在する場合,タイムアウトメソッドのコールバックの処理は,コールバック完了時からトランザクションAが決着するまで排他待ちとなります。したがって,タイムアウトメソッドがCMTのトランザクションの管理下にある場合,そのトランザクションの決着は,トランザクションAが決着するまで待ちます。この場合の流れを次の図に示します。