2.12.2 EJBタイマの生成とコールバック実行時の動作
Timer Serviceによって指定した時刻に処理を実行するには,EJBタイマを生成します。また,EJBタイマによる処理の実行を停止するには,EJBタイマを削除します。EJBタイマの生成,削除のタイミングは,EJBタイマの種別や,トランザクションの管理下で処理が実行されるかどうかによって異なります。ここでは,EJBタイマの生成と削除のタイミング,およびEJBタイマの生成時と削除時のタイムアウトメソッドのコールバックの動作について説明します。
EJBタイマ生成では,EJBタイマ生成メソッド(javax.ejb.TimerServiceオブジェクトのcreateTimerメソッド)によって,EJBタイマが一つ生成されます。EJBタイマが生成されると,指定した時刻にタイムアウトが発生してタイムアウトメソッドがコールバックされます。
(1) タイムアウト時刻のカウント
EJBタイマ生成時に,EJBタイマを呼び出してから1回目のタイムアウトメソッドを実行するまでの時間を指定しているEJBタイマの場合,時間のカウントは,EJBタイマ生成メソッドが呼ばれた時刻を基点に開始されます。EJBタイマの生成とカウントの開始について次の図に示します。
(2) EJBタイマ生成とタイムアウトメソッドのコールバック実行のタイミング
EJBタイマが生成されるタイミングおよびタイムアウトメソッドがコールバックされるタイミングは,EJBタイマ生成がトランザクションの管理下で行われるかどうかによって異なります。
- EJBタイマ生成がトランザクションの管理下で行われる場合
-
EJBタイマは,トランザクションがコミットした時に生成されます。
タイムアウトメソッドのコールバックが実行されるタイミングは,トランザクションがコミットしたあとにタイムアウト時刻となるEJBタイマの場合と,トランザクションがコミットする前にタイムアウト時刻となるEJBタイマの場合とで異なります。なお,トランザクションがロールバックされた場合は,EJBタイマの生成は取り消されます。
-
トランザクションがコミットしたあとにタイムアウト時刻となるEJBタイマの場合
指定した時刻どおりにタイムアウトメソッドがコールバックされます。EJBタイマ生成とコールバックの実行について次の図に示します。
図2‒20 EJBタイマ生成とコールバックの実行(トランザクションがコミットしたあとにタイムアウト時刻となるEJBタイマの場合) この図では,EJBタイマ生成メソッドが呼ばれた時点から,タイムアウト時刻までのカウントが開始され,指定した時刻どおりにタイムアウトメソッドがコールバックされます。EJBタイマが生成されるのは,トランザクションコミット時です。
-
トランザクションがコミットする前にタイムアウト時刻となるEJBタイマの場合
トランザクションがコミットした直後にタイムアウトメソッドがコールバックされます。EJBタイマ生成とコールバックの実行について次の図に示します。
図2‒21 EJBタイマ生成とコールバックの実行(トランザクションがコミットする前にタイムアウト時刻となるEJBタイマの場合) この図では,EJBタイマ生成メソッドが呼ばれた時点から,タイムアウト時刻までのカウントが開始され,トランザクションコミットの前にタイムアウト時刻になります。トランザクションコミット時までEJBタイマは生成されないため,タイムアウト時刻になってもタイムアウトメソッドはコールバックされません。トランザクションがコミットした直後にコールバックされます。
-
- EJBタイマ生成がトランザクションの管理下で行われない場合
-
EJBタイマはEJBタイマ生成メソッドが呼ばれた直後に生成されます。
トランザクションの管理下でない場合のEJBタイマ生成について次の図に示します。
図2‒22 EJBタイマ生成とコールバックの実行(トランザクションの管理下でない場合)
この図では,EJBタイマ生成メソッドが呼ばれた直後にEJBタイマが生成されます。そのあと,指定した時刻どおりにタイムアウトメソッドがコールバックされます。