ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド

10.6 EJBタイマーサービス

EJBタイマーサービスとは

ここでは、EJBサービスの時間監視機能のひとつであるEJBタイマーサービスについて説明します。
EJBタイマーサービスは、EJB2.1規約から追加された機能です。本機能では、以下のようなタイマーを作成し、任意の時刻にEJBコンテナからコールバック処理を実行させることができます。

したがって、例えば買い物をするとポイントが貯まるサービスで、毎日0:00にポイントを集計し、ポイントが貯まったお客様に販促メールを配信するといったタイマーを利用したイベント処理を作成することが可能になります。

注意

本機能はEJBアプリケーションでタイマーを作成する機能です。タイマーを作成したIJServerプロセスが停止した場合(メモリ不足などにより強制停止した場合を含む)には、タイマーも停止します。このため、タイマーが予期せず停止する場合がありますので、常時タイマーを起動しておきたい場合には他の時間監視機能を使用することをお勧めします。

使用可能なEJBアプリケーション

EJBタイマーサービスはSTATELESS Session Bean、Message-driven Beanで使用可能です。

基本機能

タイマーの生成方法

タイマーはEJBタイマーサービスのcreateTimerメソッドを実行して生成します。createTimerメソッドの引数に実行時刻や実行間隔を指定します。EJBタイマーサービスは、Enterprise BeanにEJBコンテナより渡されるEJBコンテキストのgetTimerServiceメソッドを実行して取得します。

タイマーのキャンセル方法

生成したタイマーをキャンセルするには、Enterprise Beanより生成したタイマーのcancelメソッドを実行します。タイマーは、Enterprise BeanにてgetTimerServiceメソッドを実行して取得したEJBタイマーサービスに対し、getTimersメソッドを実行することにより取得できます。また、コールバック処理(ejbTimeoutメソッド)の引数で渡されます。

コールバック処理の実行

タイマー生成時に指定した時刻に、EJBタイマーサービスより各Enterprise Beanのコールバック処理(ejbTimeoutメソッド)を実行します。Enterprise Beanはjavax.ejb.TimedObjectインタフェースを実装している必要があります。

EJBタイマーサービスの有効範囲

タイマーは生成したプロセス内でのみ使用できます。そのためEnterprise BeanのRemoteインタフェースやWebサービスのエンドポイントを通してリモート側で取得しないでください。また、クラスタ構成やプロセス多重環境での使用は未サポートです。EJBタイマーサービスを実装したEJBアプリケーションを配備してプロセス多重度を2以上に設定したIJServerで起動した場合は、IJServer21148のエラーが発生します。

EJBタイマーサービスで生成するタイマーは、配備したモジュールが非活性になると削除されます。そのため以下の操作を行った場合、必要に応じてタイマーを再登録してください。

タイマーの正確性と処理遅延時の動作

負荷が集中するとタイマーの開始時間がずれる場合があります。
タイマーの処理がすぐに完了せず、後続のタイマーの実行時間が来た場合、後続のタイマーは実行中のタイマーの完了を待ちます。実行中のタイマーが完了後、実行予定時刻が超過しているタイマーはただちに実行されます。一定間隔で実行するタイマーの場合、実行予定時刻を越えている処理分連続して実行されます。

トランザクションとの関係

タイマー生成時

トランザクションの範囲内で生成したタイマーは、トランザクションがロールバックされると削除されます。

タイマーキャンセル時

トランザクションの範囲内でタイマーをキャンセルした場合、トランザクションがロールバックされるとキャンセルは無効になります。新規タイマーの場合は削除されます。既存のタイマーの場合は継続して動作します。

コールバック処理実行時

コールバック処理実行時のトランザクションは、EJBアプリケーションに定義されたトランザクション属性により以下のように動作します。

トランザクション属性

EJBコンテナの処理

RequiresNew
Required

EJBコンテナはトランザクションを新しく開始してからコールバック処理を実行します。
トランザクション内でロールバックされた場合、もしくは例外が発生した場合、EJBタイマーサービスはコールバック処理を1回だけリトライします。リトライ中に再びロールバックされた場合、もしくは例外が発生した場合、警告メッセージIJServer21147をコンテナログに出力し、タイマーの処理を継続します。

Supports
NotSupported
Never

EJBコンテナはトランザクションを開始せず、コールバック処理を実行します。

Mandatory

指定できません。
指定された場合、EJBアプリケーション活性時にエラーメッセージIJServer21095をコンテナログに出力します。

トランザクション属性の詳細は“10.4.1 トランザクション管理種別とトランザクション属性”を参照してください。

コールバック処理が実行されるインスタンス

コールバック処理(ejbTimeoutメソッド)はそれぞれ以下のインスタンス上で実行されます。

EJBタイマーサービスを利用するアプリケーション作成方法

以降で、EJBタイマーサービスを利用するアプリケーションの作成方法を説明します。