Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

5.10.4 EJBタイマとコールバックの動作についての注意事項

次の場合のEJBタイマの動作およびコールバックの動作について説明します。

<この項の構成>
(1) EJBタイマに過去の時刻が指定された場合
(2) 一つのEnterprise Beanのクラスで複数のEJBタイマを設定している場合
(3) タイムアウト時に,前回のコールバックが終了していない場合
(4) 複数スレッドからEJBタイマキャンセルが呼ばれた場合
(5) コールバック実行中にEJBタイマキャンセルが呼ばれた場合
(6) コールバック時に,EJBタイマキャンセルを行った未決着トランザクションがある場合

(1) EJBタイマに過去の時刻が指定された場合

EJBタイマに過去の時刻が指定された場合,single-eventタイマのときはEJBタイマの生成直後に1回タイムアウトメソッドをコールバックします。intervalタイマの場合は,EJBタイマ生成後の時刻に発生するタイムアウト時にタイムアウトメソッドをコールバックします。EJBタイマに過去の時刻が指定された場合の動作を次の図に示します。

図5-22 EJBタイマに過去の時刻が指定された場合の動作

[図データ]

single-eventタイマの場合
2:00にタイムアウトが発生するsingle-eventタイマが,すでにタイムアウトの時刻を過ぎた4:15に生成された場合,生成直後に1回タイムアウトメソッドをコールバックします。

intervalタイマの場合
2:00から2時間間隔でタイムアウトが発生するintervalタイマが,すでにタイムアウトの時刻を過ぎた4:15に生成された場合,それ以降の時刻に発生するタイムアウト時(1回目は6:00)にタイムアウトメソッドをコールバックします。

(2) 一つのEnterprise Beanのクラスで複数のEJBタイマを設定している場合

一つのEnterprise Beanクラスに対して,複数のEJBタイマがある場合に,それらの複数のEJBタイマのコールバックが重なったときは,コールバック処理が並列に行われます。ただし,並列に処理できるコールバックスレッドやEnterprise Beanインスタンスがある場合に限ります。このようなコールバックスレッドやインスタンスがない場合は,スレッドやインスタンスが解放されるまで待ちます。

(3) タイムアウト時に,前回のコールバックが終了していない場合

一つのEJBタイマで同時に実行できるコールバックは一つだけです。タイムアウトメソッドの処理は,処理内容によっては時間が長く掛かることがあります。そのため,intervalタイマの場合,コールバック処理の実行中に次のタイムアウトの時刻を過ぎてしまい,一つのコールバックが完了するまでに複数のタイムアウト時刻を経過することがあります。この場合,タイムアウトの時刻どおりに実行されなかったコールバック処理は行わないで,前回のコールバックが終了した時刻よりあとに発生するタイムアウトのコールバック処理を行います。

コールバック時に,前回のコールバックが終了していない場合の動作を次の図に示します。

図5-23 コールバック時に前回のコールバックが終了していない場合の動作

[図データ]

この図の場合,1分間隔でタイムアウトが発生してコールバック処理を実行する設定にしています。1回目のコールバックの処理中に,2回目と3回目のタイムアウトの時刻を過ぎてしまった場合,1回目のコールバック処理が終了したあとの,次のタイムアウト時刻(予定では4回目のタイムアウトの時刻)に2回目のコールバック処理を行います。タイムアウト時刻を過ぎてしまった2回分のコールバック処理は行われません。

(4) 複数スレッドからEJBタイマキャンセルが呼ばれた場合

同時に複数のスレッドから,同一EJBタイマのEJBタイマキャンセルメソッドが呼ばれた場合,キャンセルの処理は順次行われます。

ただし,トランザクション管理下でEJBタイマキャンセルが行われた場合,トランザクションが決着するまでは,EJBタイマが削除されるかどうかを確定できません。そのため,そのほかのスレッドが同じEJBタイマのキャンセルを行うと,排他待ちとなります。

同時に複数のスレッドから,同一のEJBタイマのキャンセルが呼ばれた場合の動作を次の図に示します。

図5-24 複数スレッドからのEJBタイマのキャンセル

[図データ]

(5) コールバック実行中にEJBタイマキャンセルが呼ばれた場合

EJBタイマのキャンセル時に,タイムアウトメソッドのコールバックが実行中の場合,次のような動作になります。

(6) コールバック時に,EJBタイマキャンセルを行った未決着トランザクションがある場合

EJBタイマキャンセルを行った未決着のトランザクションAが存在する場合,タイムアウトメソッドのコールバックの処理は,コールバック完了時からトランザクションAが決着するまで排他待ちとなります。したがって,タイムアウトメソッドがCMTのトランザクションの管理下にある場合,そのトランザクションの決着は,トランザクションAが決着するまで待ちます。この場合の流れを次の図に示します。

図5-27 キャンセルを行った未決着トランザクションがある場合のコールバックの動作

[図データ]