2.12.2 EJBタイマの生成とコールバック実行時の動作

Timer Serviceによって指定した時刻に処理を実行するには,EJBタイマを生成します。また,EJBタイマによる処理の実行を停止するには,EJBタイマを削除します。EJBタイマの生成,削除のタイミングは,EJBタイマの種別や,トランザクションの管理下で処理が実行されるかどうかによって異なります。ここでは,EJBタイマの生成と削除のタイミング,およびEJBタイマの生成時と削除時のタイムアウトメソッドのコールバックの動作について説明します。

<この項の構成>
(1) EJBタイマの生成
(2) J2EEサーバ起動時のEJBタイマの自動生成

(1) EJBタイマの生成

EJBタイマ生成では,EJBタイマ生成メソッド(javax.ejb.TimerServiceオブジェクトのcreateTimerメソッド)によって,EJBタイマが一つ生成されます。EJBタイマが生成されると,指定した時刻にタイムアウトが発生してタイムアウトメソッドがコールバックされます。

(a) タイムアウト時刻のカウント

EJBタイマ生成時に,EJBタイマを呼び出してから1回目のタイムアウトメソッドを実行するまでの時間を指定しているEJBタイマの場合,時間のカウントは,EJBタイマ生成メソッドが呼ばれた時刻を基点に開始されます。EJBタイマの生成とカウントの開始について次の図に示します。

図2-18 EJBタイマの生成とカウントの開始

[図データ]

(b) EJBタイマ生成とタイムアウトメソッドのコールバック実行のタイミング

EJBタイマが生成されるタイミングおよびタイムアウトメソッドがコールバックされるタイミングは,EJBタイマ生成がトランザクションの管理下で行われるかどうかによって異なります。

EJBタイマ生成がトランザクションの管理下で行われる場合
EJBタイマは,トランザクションがコミットした時に生成されます。
タイムアウトメソッドのコールバックが実行されるタイミングは,トランザクションがコミットしたあとにタイムアウト時刻となるEJBタイマの場合と,トランザクションがコミットする前にタイムアウト時刻となるEJBタイマの場合とで異なります。なお,トランザクションがロールバックされた場合は,EJBタイマの生成は取り消されます。
  • トランザクションがコミットしたあとにタイムアウト時刻となるEJBタイマの場合
    指定した時刻どおりにタイムアウトメソッドがコールバックされます。EJBタイマ生成とコールバックの実行について次の図に示します。

    図2-19 EJBタイマ生成とコールバックの実行(トランザクションがコミットしたあとにタイムアウト時刻となるEJBタイマの場合)

    [図データ]

    この図では,EJBタイマ生成メソッドが呼ばれた時点から,タイムアウト時刻までのカウントが開始され,指定した時刻どおりにタイムアウトメソッドがコールバックされます。EJBタイマが生成されるのは,トランザクションコミット時です。
  • トランザクションがコミットする前にタイムアウト時刻となるEJBタイマの場合
    トランザクションがコミットした直後にタイムアウトメソッドがコールバックされます。EJBタイマ生成とコールバックの実行について次の図に示します。

    図2-20 EJBタイマ生成とコールバックの実行(トランザクションがコミットする前にタイムアウト時刻となるEJBタイマの場合)

    [図データ]

    この図では,EJBタイマ生成メソッドが呼ばれた時点から,タイムアウト時刻までのカウントが開始され,トランザクションコミットの前にタイムアウト時刻になります。トランザクションコミット時までEJBタイマは生成されないため,タイムアウト時刻になってもタイムアウトメソッドはコールバックされません。トランザクションがコミットした直後にコールバックされます。
EJBタイマ生成がトランザクションの管理下で行われない場合
EJBタイマはEJBタイマ生成メソッドが呼ばれた直後に生成されます。
トランザクションの管理下でない場合のEJBタイマ生成について次の図に示します。

図2-21 EJBタイマ生成とコールバックの実行(トランザクションの管理下でない場合)

[図データ]

この図では,EJBタイマ生成メソッドが呼ばれた直後にEJBタイマが生成されます。そのあと,指定した時刻どおりにタイムアウトメソッドがコールバックされます。

(2) J2EEサーバ起動時のEJBタイマの自動生成

Timer Serviceを使用している場合に,J2EEサーバ起動時にEJBタイマを自動で生成する方法について説明します。EJBタイマの自動生成には次の方法があります。

Timer Serviceの機能については,「2.12.1 Timer Serviceの概要」を参照してください。