| Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド 10g(10.1.3.1.0) B31852-03 |
|
この章の内容は次のとおりです。
詳細は、「EJBタイマー・サービスについて」を参照してください。
Java EEタイマーを使用する次のタイプのEnterprise Beanを構成できます。
Java EEタイマーを使用するEnterprise Beanを構成するには、次のようにします。
javax.ejb.TimerServiceを取得します。
TimerServiceのメソッドcreateTimerを使用して適切なタイプのタイマーを作成します(javax.ejb.TimerService APIを参照)。EJB 2.1エンティティBeanでTimerを作成すると、その主キーで識別される特定のエンティティBeanインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。特定のエンティティBeanに対して作成されたタイマーは、そのエンティティBeanの削除時に削除されます。
他の任意のタイプのEnterprise BeanでTimerを作成すると、プール状態にあるそのタイプのインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。
このメソッドは、staticまたはfinalにすることはできません。また、このメソッドは次のシグネチャを持つ必要があります。
void <METHOD>(Timer timer)
タイムアウト・コールバック・メソッドは、次のいずれかの方法で実装できます。
import javax.ejb.Stateless;
import javax.ejb.TimerService;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless;
public class TimerServiceBean implement MyTimerService {
// injection of TimerService
@Resource TimerService timerService;
// implement bean business interface MyTimerService
@TransactionAttribute(value=TransactionAttributeType.REQUIRES_NEW)
// default TransactionAttributeType.REQUIRED
public void createTimer(Serializable timerInfo) {
timerService.createTimer(timeout, info);
}
...
// user annotated timeout method
@Timeout
@TransactionAttribute(value=TransactionAttributeType.REQUIRES_NEW)
public void timeoutCallback(Timer timer) {
...
}
}
例25-2 EJB 2.1ステートレス・セッションBeanでのJava EEタイマーの構成
import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.EJBContext;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.TimedObject;
import javax.ejb.Timer;
import javax.ejb.TimerService;
class ServiceBean_2_1 implements SessionBean, MyTimerService, TimedObject {
EJBContext ctx;
// implement bean business interface MyTimerService
public void createTimer(long duration, Serializable info) {
TimerService timerService = ctx.getTimerService();
timerService.createTimer(duration, info);
}
// implement TimedObject
public void ejbTimeout(Timer timer) {
System.out.println("Timeout: " + timer.getInfo());
}
...
// implement SessionBean
public void setSessionContext(SessionContext ctx) throws EJBException,
RemoteException {
this.ctx = ctx;
}
}
OC4J cronタイマーは、次のBeanとともに使用できます。
指定された間隔で定期的に実行されるようにタイマーをスケジュールすることができます。UNIXでは、cronタイマーと呼ばれています。
例25-3に、cronタイマーの様々なスケジュールの設定方法を示します。アスタリスクがある場合、すべての値が有効です。
20 * * * * --> 20 minutes after every hour, such as 00:20, 01:20, and so on
5 22 * * * --> Every day at 10:05 P.M.
0 8 1 * * --> First day of every month at 8:00 A.M.
0 8 4 7 * --> The fourth of July at 8:00 A.M.
15 12 * * 5 --> Every Friday at 12:15 P.M.
cronのtime変数のフォーマットでは、次の5つの時間フィールドを使用します。
1つのフィールド内で複数の値をカンマまたはダッシュで区切って、例25-4に示すように複雑なタイマーを定義できます。
0 8 * * 1,3,5 --> Every Monday, Wednesday, and Friday at 8:00 A.M.
0 8 1,15 * * --> The first and 15th of every month at 8:00 A.M.
0 8-17 * * 1-5 --> Every hour from 8 A.M. through 5 P.M., Monday through Friday
OC4J cronタイマーを使用するEnterprise Beanを構成するには、次のようにします。
oracle.j2ee.ejb.timer.EJBTimerServiceを取得します。
EJBTimerServiceのメソッドcreateTimerを使用して適切なタイプのタイマーを作成します。次に示すEJBTimerServiceの任意のメソッドを使用できます。これらのメソッドは、すべてjavax.ejb.Timer型のオブジェクトを返し、IllegalArgumentExceptionおよびIllegalStateExceptionをスローします。
createTimer(String cronline, Serializable info)このメソッドは、次の例に示すように、String cron行を渡すことでBeanのタイムアウト・コールバック・メソッドを起動するOC4J cronタイマーを作成する場合に使用します。info引数を使用して、アプリケーション情報をOC4Jに渡します。この引数にはnullを設定できます。
... import oracle.j2ee.ejb.timer.EJBTimerService; import javax.ejb.timer.Timer; ... @Resource EJBTimerService ets; String cron = "1 * * * *"; String info = ""; Timer et = ets.createTimer(cron, info); ...
createTimer(int minute, int hour, int dayOfMonth, int month, int dayOfWeek, Serializable info)またはcreateTimer(int minute, int hour, int dayOfMonth, int month, int dayOfWeek, int year, Serializable info)
このメソッドは、次の例に示すように、個別の引数として各cronフィールドを渡すことでBeanのタイムアウト・コールバック・メソッドを起動するOC4J cronタイマーを作成する場合に使用します。info引数を使用して、アプリケーション情報をOC4Jに渡します。この引数にはnullを設定できます。
... import oracle.j2ee.ejb.timer.EJBTimerService; import javax.ejb.timer.Timer; ... @Resource EJBTimerService ets; int min=15; // minutes int hr=13; // hour (1 PM) int dom=28; // day of month int mo=1; // month (January) int dow=3; // day of week (Wednesday) String info = ""; Timer et = ets.createTimer(min, hr, dom, mo, dow, info); ...
createTimer(String cronline, String className, Serializable info)このメソッドは、次の例に示すように、String cron行を渡すことで特定のJavaクラスのmainメソッドを起動するOC4J cronタイマーを作成する場合に使用します。info引数には、nullを設定するか、クラスのmainメソッドに渡すパラメータのString[]を設定できます。
... import mypackage.MyClass; import oracle.j2ee.ejb.timer.EJBTimerService; import javax.ejb.timer.Timer; ... @Resource EJBTimerService ets; String cron = "1 * * * *"; String info = ""; Timer et = ets.createTimer(cron, MyClass.class.getName(), info); ...
createTimer(int minute, int hour, int dayOfMonth, int month, int dayOfWeek, String className, Serializable info)またはcreateTimer(int minute, int hour, int dayOfMonth, int month, int dayOfWeek, int year, String className, Serializable info)
このメソッドは、次の例に示すように、個別の引数として各cronフィールドを渡すことで特定のJavaクラスのmainメソッドを起動するOC4J cronタイマーを作成する場合に使用します。info引数には、nullを設定するか、クラスのmainメソッドに渡すパラメータのString[]を設定できます。
... import mypackage.MyClass; import oracle.j2ee.ejb.timer.EJBTimerService; import javax.ejb.timer.Timer; ... @Resource EJBTimerService ets; int min=15; // minutes int hr=13; // hour (1 PM) int dom=28; // day of month int mo=1; // month (January) int dow=3; // day of week (Wednesday) String info = ""; Timer et = ets.createTimer(min, hr, dom, mo, dow, MyClass.class.getName(), info); ...
EJB 2.1エンティティBeanでTimerを作成すると、その主キーで識別される特定のエンティティBeanインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。特定のエンティティBeanに対して作成されたタイマーは、そのエンティティBeanの削除時に削除されます。
他の任意のタイプのEJBでTimerを作成すると、プール状態にあるそのタイプのインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。
Classを取得しないcreateTimerメソッドを使用するタイマーを作成した場合、OC4Jにより、タイムアウト・コールバック・メソッドがタイマーの起動時に実行されます。タイムアウト・コールバック・メソッドは、staticまたはfinalにすることはできません。また、このメソッドは次のシグネチャを持つ必要があります。
void <METHOD>(Timer timer)
タイムアウト・コールバック・メソッドは、次のいずれかの方法で実装できます。
Classを取得するcreateTimerメソッドを使用するタイマーを作成した場合、OC4Jにより、指定されたClassのmainメソッドがタイマーの起動時に実行されます。mainメソッドは、次のシグネチャを持つ必要があります。
public static void main(String args[])例25-5 EJB 3.0ステートレス・セッションBeanでのOC4J cronタイマーの構成
import javax.ejb.Stateless;
import javax.annotation.PostConstruct;
import oracle.j2ee.ejb.timer.EJBTimerService;
import javax.ejb.Timer;
import javax.ejb.Timeout;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class MySession {
@PostConstruct
@TransactionAttribute(value=REQUIRES_NEW)
public void initialize() {
@Resource EJBTimerService ets;
String cron = "1 * * * *";
String info = "";
Timer et = ets.createTimer(cron, info);
}
...
@Timeout
@TransactionAttribute(value=REQUIRES_NEW)
public void timeoutCallback(Timer timer) {
...
}
}
例25-6 EJB 2.1ステートレス・セッションBeanでのOC4J cronタイマーの構成
import javax.ejb.SessionBean;
import oracle.j2ee.ejb.timer.EJBTimerService;
import javax.ejb.TimedObject;
public class MySession implements SessionBean, TimedObject {
public void initialize() {
String cron = "1 * * * *";
String info = "";
InitialContext ctx = new InitialContext();
EJBTimerService ets = (EJBTimerService) ctx.getTimerService();
Timer et = ets.createTimer(cron, info);
}
...
public void ejbTimeout(Timer timer) {
...
}
}
この項の内容は次のとおりです。
Timerオブジェクトを使用して、タイマーの情報を取得したり、タイマーをキャンセルしたりすることができます。使用できるメソッドは、cancel、getTimeRemaining、getNextTimeout、getHandleおよびgetInfoです。オブジェクトの等価性を比較するには、Timer.equals(Object obj)メソッドを使用します。
タイマーは、Bean(ejbLoad、ejbStoreなど)のライフ・サイクル中持続するように設定する必要があります。永続Timerオブジェクトは、そのハンドルを使用して取得できます。TimerHandleは、Timer.getHandleメソッドを使用して取得します。次に、TimerHandle.getTimerメソッドを使用して、永続Timerオブジェクトを取得できます。
タイマーは、通常、トランザクションの有効範囲内で作成またはキャンセルします。このため、Beanは、RequiresNewを使用してトランザクション内に存在するよう構成するのが普通です。トランザクションがロールバックされると、コンテナはタイムアウトを再試行します。
トランザクションの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。
正常に起動された、またはキャンセルされたタイマー・オブジェクトでメソッドを起動しようとすると、NoSuchObjectLocalExceptionが返されます。
|
![]() Copyright © 2002, 2008 Oracle Corporation. All Rights Reserved. |
|