Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 基本・開発編(EJBコンテナ)


2.12.6 EJBタイマとコールバックの動作

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

〈この項の構成〉

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

タイマの種類によって動作が異なります。

(a) single-eventタイマまたはintervalタイマの場合

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

図2‒26 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タイマの場合,コールバック処理の実行中に次のタイムアウトの時刻を過ぎてしまい,一つのコールバックが完了するまでに複数のタイムアウト時刻を経過することがあります。この場合,タイムアウトの時刻どおりに実行されなかったコールバック処理は行わないで,前回のコールバックが終了した時刻よりあとに発生するタイムアウトのコールバック処理を行います。

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

図2‒27 コールバック時に前回のコールバックが終了していない場合の動作

[図データ]

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

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

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

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

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

図2‒28 複数スレッドからのEJBタイマのキャンセル

[図データ]

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

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

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

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

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

[図データ]