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. |
|