ヘッダーをスキップ

Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド
10g(10.1.3.1.0)

B31852-03
目次
目次
索引
索引

戻る 次へ

25 タイマー・サービスの構成

この章の内容は次のとおりです。

詳細は、「EJBタイマー・サービスについて」を参照してください。

Java EEタイマーを使用するEnterprise Beanの構成

Java EEタイマーを使用する次のタイプのEnterprise Beanを構成できます。

Java EEタイマーを使用するEnterprise Beanを構成するには、次のようにします。

  1. 次のいずれかの方法でjavax.ejb.TimerServiceを取得します。

    • EJB 3.0 Enterprise Beanでは、例25-1に示すように@Resourceアノテーションを使用します。

    • EJB 3.0またはEJB 2.1 Enterprise Beanでは、例25-1に示すようにEJBContextまたはInitalContextのメソッドgetTimerServiceを使用します。

  2. 例25-1および例25-1に示すように、TimerServiceのメソッドcreateTimerを使用して適切なタイプのタイマーを作成します(javax.ejb.TimerService APIを参照)。

    EJB 2.1エンティティBeanでTimerを作成すると、その主キーで識別される特定のエンティティBeanインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。特定のエンティティBeanに対して作成されたタイマーは、そのエンティティBeanの削除時に削除されます。

    他の任意のタイプのEnterprise BeanでTimerを作成すると、プール状態にあるそのタイプのインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。

  3. タイムアウト・コールバック・メソッドを実装します。

    このメソッドは、staticまたはfinalにすることはできません。また、このメソッドは次のシグネチャを持つ必要があります。

    void <METHOD>(Timer timer)
    
    

    タイムアウト・コールバック・メソッドは、次のいずれかの方法で実装できます。

    • EJB 3.0 Enterprise Beanでは、例25-1に示すように任意のBeanメソッドに@Timeoutアノテーションを付けます。

    • EJB 3.0またはEJB 2.1 Enterprise Beanでは、例25-1に示すようにjavax.ejb.TimedObjectインタフェースを実装します。

例25-1    EJB 3.0ステートレス・セッションBeanでのJava EEタイマーの構成

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タイマーを使用するEnterprise Beanの構成

OC4J cronタイマーは、次のBeanとともに使用できます。

指定された間隔で定期的に実行されるようにタイマーをスケジュールすることができます。UNIXでは、cronタイマーと呼ばれています。

例25-3に、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に示すように複雑なタイマーを定義できます。

例25-4    複雑なcronタイマー

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を構成するには、次のようにします。

  1. 次のいずれかの方法でoracle.j2ee.ejb.timer.EJBTimerServiceを取得します。

    • EJB 3.0 Enterprise Beanでは、例25-5に示すように@Resourceアノテーションを使用します。

    • EJB 3.0またはEJB 2.1 Enterprise Beanでは、例25-6に示すようにEJBContextまたはInitalContextのメソッドgetTimerServiceを使用します。

  2. 例25-5および例25-6に示すように、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を作成すると、プール状態にあるそのタイプのインスタンスのタイムアウト・コールバック・メソッドがコンテナにより起動されます。

  3. タイマーの起動時にOC4Jで実行するアクションに応じて、次のように構成を完了します。

    1. Classを取得しないcreateTimerメソッドを使用するタイマーを作成した場合、OC4Jにより、タイムアウト・コールバック・メソッドがタイマーの起動時に実行されます。

      タイムアウト・コールバック・メソッドは、staticまたはfinalにすることはできません。また、このメソッドは次のシグネチャを持つ必要があります。

      void <METHOD>(Timer timer)
      
      

      タイムアウト・コールバック・メソッドは、次のいずれかの方法で実装できます。

      • EJB 3.0 Enterprise Beanでは、例25-5に示すように任意のBeanメソッドに@Timeoutアノテーションを付けます。

      • EJB 3.0またはEJB 2.1 Enterprise Beanでは、例25-6に示すようにjavax.ejb.TimedObjectインタフェースを実装します。

    2. Classを取得するcreateTimerメソッドを使用するタイマーを作成した場合、OC4Jにより、指定されたClassmainメソッドがタイマーの起動時に実行されます。

      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オブジェクトを使用して、タイマーの情報を取得したり、タイマーをキャンセルしたりすることができます。使用できるメソッドは、cancelgetTimeRemaininggetNextTimeoutgetHandleおよびgetInfoです。オブジェクトの等価性を比較するには、Timer.equals(Object obj)メソッドを使用します。

永続的なタイマーの取得

タイマーは、Bean(ejbLoadejbStoreなど)のライフ・サイクル中持続するように設定する必要があります。永続Timerオブジェクトは、そのハンドルを使用して取得できます。TimerHandleは、Timer.getHandleメソッドを使用して取得します。次に、TimerHandle.getTimerメソッドを使用して、永続Timerオブジェクトを取得できます。


注意

タイマーとそのハンドルは、ローカル・オブジェクトです。このため、Beanのリモート・インタフェースを介して渡すことは避けてください。 


トランザクションの有効範囲内でのタイマーの使用

タイマーは、通常、トランザクションの有効範囲内で作成またはキャンセルします。このため、Beanは、RequiresNewを使用してトランザクション内に存在するよう構成するのが普通です。トランザクションがロールバックされると、コンテナはタイムアウトを再試行します。

トランザクションの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。

タイマーについてNoSuchObjectLocalExceptionが発生する場合

正常に起動された、またはキャンセルされたタイマー・オブジェクトでメソッドを起動しようとすると、NoSuchObjectLocalExceptionが返されます。


戻る 次へ
Oracle
Copyright © 2002, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引