EJBコンテナが提供するEJBタイマーサービス機能は、タイマーをEJBコンテナに設定することで、任意の時刻にEJBコンテナがEJBセションBeanを実行します。
ApcoordinatorのEJBアプリケーションフレームワークでは、EJBタイマーサービス機能を使用して指定時刻にビジネスクラスを呼び出すことができます。
注意
EJBタイマーサービス機能を利用する場合、以下の点に注意してください。
EJBタイマーサービス機能は、EJB 2.1以上のステートレスセションBeanだけで使用することができます。
EJBタイマーサービスでは、呼び出す時刻をミリ秒単位で指定しますが、ミリ秒単位の精度のタイマーを提供するものではありません。
EJBタイマーサービス機能を利用してビジネスクラスを呼び出す場合は、アプリケーションを次のように作成します。
タイマー情報クラスを作成する
EJBタイマーサービスでは、タイマーの作成時に任意のデータをタイマーに設定して、コールバック処理時に参照できます。これを利用して、ビジネスクラスのメソッド呼び出しに必要なデータBean、コマンド名をタイマーに設定します。タイマーに設定可能なオブジェクトは1つであるため、データBean、コマンド名を格納するためのクラスを作成する必要があります。ここでは、このクラスをタイマー情報クラスと呼びます。タイマー情報クラスは、例えばJavaBeans形式のクラスとして作成します。
タイマー情報クラス(JavaBeans形式)の作成例
import com.fujitsu.uji.DataBean; public class UserTimerInfo implements java.io.Serializable { // データBean DataBean dataBean; // コマンド名 String verb; public DataBean getDataBean() { return dataBean; } public void setDataBean(DataBean dataBean) { this.dataBean = dataBean; } public String getVerb() { return verb; } public void setVerb(String verb) { this.verb = verb; } }
注意
タイマー情報クラスの作成では、以下の点に注意してください。
タイマー情報クラスは、シリアライズ可能である必要があります。
タイマー情報クラス内では、データBeanを除いて、Apcoordinatorが提供するクラスを継承、もしくはインターフェイスを実装したクラスを保持することはできません。
タイマーを作成する
タイマーの作成は、次の手順で行います。
EJBSessionProfileのgetEJBContextメソッドを使用して、EJBContextを取得します。取得したEJBContextのgetTimerServiceメソッドを使用して、TimerServiceを取得します。
タイマー情報クラスを生成して、呼び出すビジネスクラスのメソッドに対応したデータBeanとコマンド名をタイマー情報クラスに設定します。
TimerServiceのcreateTimerメソッドを使用して、時刻とタイマー情報クラスを指定します。この処理により、タイマーが作成され、開始されます。
60秒後に1回だけビジネスクラスを呼び出すタイマーの作成例
import javax.ejb.EJBContext;
import javax.ejb.TimerService;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.GenericHandler;
import com.fujitsu.uji.ejb.bean.EJBSessionProfile;
public class EjbTimerHandler extends GenericHandler {
public Object createTimer(DispatchContext context, test.DataBean dataBean) {
// EJBSessionProfileの取得
EJBSessionProfile sp = (EJBSessionProfile)context.getSessionProfile();
// EJBContextの取得
EJBContext ejbContext = (EJBContext)sp.getEJBContext();
// TimerServiceの取得
TimerService ts = ejbContext.getTimerService();
// タイマー情報クラスの生成
UserTimerInfo userTimerInfo = new UserTimerInfo();
// データBeanを設定
userTimerInfo.setDataBean(dataBean);
// コマンド名を設定
userTimerInfo.setVerb("verb1");
// タイマーを作成
ts.createTimer(60000, userTimerInfo);
return dataBean;
}
}
注意
タイマーの作成をトランザクションの範囲内で実行した場合、トランザクションがロールバックされると、 EJBコンテナはタイマーの作成を取り消します。 詳細については、ご使用になるアプリケーションサーバーのマニュアルを参照してください。
ejbTimeoutメソッドを実装する
セションBeanクラスにTimedObjectインターフェイスを実装してejbTimeoutメソッドを作成します。 ejbTimeoutメソッドは、タイマーで指定した時刻にEJBコンテナから呼び出されるメソッドで、 TimedObjectインターフェイスで定義されています。ejbTimeoutメソッドには、 タイマーで指定した時刻に呼び出される処理を実装します。 ここでは、ビジネスクラスのメソッドを呼び出すために以下の処理を作成します。
ejbTimeoutメソッドの第一引数はTimerクラスです。Timerクラスから、タイマー作成時に設定したタイマー情報クラスを取得します。
タイマー情報クラスからデータBeanとコマンド名を取得します。
取得したデータBeanとコマンド名を指定してUjiSessionBeanクラスのexecメソッドを呼び出します。execメソッドの第三引数はnullを指定します。
ejbTimeoutメソッドの実装例
import com.fujitsu.uji.ejb.bean.UjiSessionBean; import java.lang.reflect.InvocationTargetException; import javax.ejb.TimedObject; import javax.ejb.Timer; public class EjbTimer extends UjiSessionBean implements TimedObject { public void ejbTimeout(Timer timer) { // タイマー情報クラスの取得 UserTimerInfo userTimerInfo = (UserTimerInfo)timer.getInfo(); // ビジネスクラスのメソッドの呼び出し try { exec(userTimerInfo.getDataBean(), userTimerInfo.getVerb(), null); } catch(InvocationTargetException e) { throw new RuntimeException("exec error: " + e.getMessage(), e.getCause()); } } }
注意
ejbTimeoutメソッドをトランザクションの範囲内で実行した場合、トランザクションがロールバックされると、 EJBコンテナはejbTimeoutメソッドを再試行します。 詳細については、ご使用になるアプリケーションサーバーのマニュアルを参照してください。
注意
EJB 3.0に準拠したセションBeanを用いる場合は、ejbTimeoutメソッドを以下のとおり実装してください。
execメソッドの代わりにsimpleExecメソッドを呼び出します。
simpleExecメソッドは任意の例外を発生させるため、catch節は"catch(InvocationTargetException e)"ではなく"catch(Exception e)"とします。