Cosminexus 機能解説
次の場合のEJBタイマの動作およびコールバックの動作について説明します。
EJBタイマに過去の時刻が指定された場合,single-eventタイマのときはEJBタイマの生成直後に1回タイムアウトメソッドをコールバックします。intervalタイマの場合は,EJBタイマ生成後の時刻に発生するタイムアウト時にタイムアウトメソッドをコールバックします。EJBタイマに過去の時刻が指定された場合の動作を次の図に示します。
図5-22 EJBタイマに過去の時刻が指定された場合の動作
一つのEnterprise Beanクラスに対して,複数のEJBタイマがある場合に,それらの複数のEJBタイマのコールバックが重なったときは,コールバック処理が並列に行われます。ただし,並列に処理できるコールバックスレッドやEnterprise Beanインスタンスがある場合に限ります。このようなコールバックスレッドやインスタンスがない場合は,スレッドやインスタンスが解放されるまで待ちます。
一つのEJBタイマで同時に実行できるコールバックは一つだけです。タイムアウトメソッドの処理は,処理内容によっては時間が長く掛かることがあります。そのため,intervalタイマの場合,コールバック処理の実行中に次のタイムアウトの時刻を過ぎてしまい,一つのコールバックが完了するまでに複数のタイムアウト時刻を経過することがあります。この場合,タイムアウトの時刻どおりに実行されなかったコールバック処理は行わないで,前回のコールバックが終了した時刻よりあとに発生するタイムアウトのコールバック処理を行います。
コールバック時に,前回のコールバックが終了していない場合の動作を次の図に示します。
図5-23 コールバック時に前回のコールバックが終了していない場合の動作
この図の場合,1分間隔でタイムアウトが発生してコールバック処理を実行する設定にしています。1回目のコールバックの処理中に,2回目と3回目のタイムアウトの時刻を過ぎてしまった場合,1回目のコールバック処理が終了したあとの,次のタイムアウト時刻(予定では4回目のタイムアウトの時刻)に2回目のコールバック処理を行います。タイムアウト時刻を過ぎてしまった2回分のコールバック処理は行われません。
同時に複数のスレッドから,同一EJBタイマのEJBタイマキャンセルメソッドが呼ばれた場合,キャンセルの処理は順次行われます。
ただし,トランザクション管理下でEJBタイマキャンセルが行われた場合,トランザクションが決着するまでは,EJBタイマが削除されるかどうかを確定できません。そのため,そのほかのスレッドが同じEJBタイマのキャンセルを行うと,排他待ちとなります。
同時に複数のスレッドから,同一のEJBタイマのキャンセルが呼ばれた場合の動作を次の図に示します。
図5-24 複数スレッドからのEJBタイマのキャンセル
EJBタイマのキャンセル時に,タイムアウトメソッドのコールバックが実行中の場合,次のような動作になります。
図5-25 コールバック実行中のキャンセル
図5-26 タイムアウトメソッドでのEJBタイマキャンセル
この図の場合,実際にEJBタイマがキャンセルされるのは,タイムアウトメソッド完了後です。このため,トランザクションがコミットした場合,EJBタイマはキャンセルされます。トランザクションがロールバックした場合,EJBタイマは存続します。EJBタイマキャンセルを行った未決着のトランザクションAが存在する場合,タイムアウトメソッドのコールバックの処理は,コールバック完了時からトランザクションAが決着するまで排他待ちとなります。したがって,タイムアウトメソッドがCMTのトランザクションの管理下にある場合,そのトランザクションの決着は,トランザクションAが決着するまで待ちます。この場合の流れを次の図に示します。
図5-27 キャンセルを行った未決着トランザクションがある場合のコールバックの動作
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.