ナビゲーションをスキップ

WebLogic JMX Service プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

WebLogic タイマー サービスを使用した通知の生成と受信

WebLogic Server には、特定の日時または一定の間隔で通知が送信されるようにコンフィグレーションできるタイマー サービスがあります。それらのタイマー通知をリスンして応答するには、JMX 通知リスナを作成してそれをタイマー サービスに登録します。

WebLogic タイマー サービスは、標準の JMX タイマー サービスを、WebLogic Server の実行スレッド内および WebLogic Server ユーザ アカウントのセキュリティ コンテキスト内で実行できるように拡張したものです (実行スレッドを使用すると、アプリケーションでのサーバ リソースの利用方法を調整したりパフォーマンスを最適化したりできます。詳細については、『WebLogic Server パフォーマンス チューニング ガイド』の「実行キューによるスレッド使用の制御」を参照してください)。

以下の節では、WebLogic タイマー サービスの使い方を説明します。

 


WebLogic タイマー サービスの使い方 : 主な手順

WebLogic Server では、特定のサーバ インスタンスにデプロイされたすべてのリソースからアクセスできる一元的なタイマー サービスは提供されません。代わりに、各アプリケーションで、タイマー サービスのインスタンスが必要なときに作成および管理されます。サーバ インスタンスが再起動するたびに、各アプリケーションでは必要なタイマー サービスのコンフィグレーションを再インスタンス化する必要があります。

通知を送信し、それらの通知を受信するリスナを作成するように WebLogic タイマー サービスをコンフィグレーションするには、以下のことを行うクラスを作成します。

  1. weblogic.management.timer.Timer MBean のインスタンスを作成します。
  2. Timer.addNotification API を呼び出して、特定の時刻または一定の間隔で通知オブジェクトを送信するよう Timer MBean をコンフィグレーションします。
  3. このクラスでは、addNotification API を複数回呼び出して、さまざまな時刻や時間間隔で通知オブジェクトを送信するように Timer MBean をコンフィグレーションできます。

    通知を送信するように Timer MBean をコンフィグレーションする」を参照してください。

  4. 通知リスナと必要な場合にはフィルタを作成し、そのリスナとフィルタを Timer MBean に登録します。
  5. このクラスでは、複数のリスナとフィルタを Timer MBean インスタンスに登録できます。

    リスナの作成と登録については、「WebLogic Server MBean からの通知のリスン : 主な手順」を参照してください。

  6. Timer.start メソッドを呼び出して、タイマー サービスのインスタンスを起動します。

通知を受信すると、リスナで TimerNotification のメソッドを呼び出して通知からデータを取得できます。

アプリケーションには、Timer MBean を作成しコンフィグレーションする複数のクラスを組み込めます。 各クラスは、独自の Timer MBean インスタンスを使用し、それによってインスタンス化された Timer MBean からの通知のみをリスンします。

 


通知を送信するように Timer MBean をコンフィグレーションする

通知を送信するように Timer MBean インスタンスをコンフィグレーションするには、MBean の addNotification メソッドを呼び出します。このメソッドには、通知の頻度をコンフィグレーションしたり、handback オブジェクトを指定したりするパラメータがあります。

addNotification メソッドを呼び出すと、タイマー サービスにより TimerNotification オブジェクトが作成され、その新しいオブジェクトの識別子が返されます。この識別子を使用すると、タイマーから TimerNotification オブジェクトの情報を取得したり、タイマーの通知のリストからオブジェクトを削除したりできます。指定した時刻になると、タイマー サービスは TimerNotification オブジェクトを handback オブジェクトの参照と共に送信します。

addNotification のメソッド シグネチャは次のとおりです。

addNotification (java.lang.String type, java.lang.String message,
                 java.lang.Object userData,java.util.Date startTime,
                 long period, long nbOccurences)

表 7-1 で、addNotification API の各パラメータについて説明します。詳細については、「WebLogic Server の Javadoc」で weblogic.management.timer.Timerを参照してください。

表 7-1 addNotification API のパラメータ

パラメータ

説明

java.lang.String type

この通知のブロードキャストをトリガするイベントを識別するための文字列。たとえば、毎日午前 0 時にブロードキャストされるようにコンフィグレーションする通知には midnight を指定できる。

java.lang.String message

TimerNotification オブジェクトの message 属性の値を指定する。

java.lang.Object userData

リスナに送信する必要のあるすべてのデータが格納されたオブジェクトの名前を指定する。通常は、通知を登録したクラス (コールバックとして機能) の参照を指定する。

java.util.Date startTime

タイマーが通知を送信する日時が格納された Date オブジェクトを指定する。

詳細については、次の節、「時間間隔の指定」を参照。

long period

(省略可能) 通知の間隔をミリ秒単位で指定する。このパラメータがゼロであるか、定義されていない (null の) 場合、反復的な通知は無効。

詳細については、次の節、「時間間隔の指定」を参照。

long nbOccurences

(省略可能) 通知が行われる回数を指定する。このパラメータの値がゼロであるか、定義されていない (null の) 場合で、期間がゼロでも null でもない場合、通知は無限に繰り返される。

このパラメータを指定すると、Timer MBean が関連する通知を送信するたびに、発生数が 1 ずつデクリメントされる。Timer.getNbOccurrences メソッドを使用すると、残りの回数を確認できる。発生数がゼロになると、Timer MBean によって、コンフィグレーションされている通知のリストからその通知が削除される。


 

時間間隔の指定

簡単に日付を指定できるようにするために、Timer MBean には次の整数定数が用意されています。

たとえば、次のコードでは 1 日 1 回午前 0 時に TimerNotification オブジェクトを送信するようにタイマー サービスがコンフィグレーションされます。

java.util.Date midnight =
      
java.util.Calendar.getInstance.set(HOUR_OF_DAY=24:00:00).getTime();
addNotification (eachMidnight, "the time is midnight",
      this,midnight,Timer.ONE_DAY);

指定した時刻と日付が現在の時刻と日付より前の場合、addNotification メソッドではそのエントリを次のように更新しようとします。

 


例 : 通知を毎分生成する

コード リスト 7-1 のコードは、通知を毎分送信するようにタイマー サービスをコンフィグレーションするサーブレット リスナです。このコードは次のように機能します。

  1. NotificationListener クラスを拡張して、そのクラスでインスタンス化した Timer MBean からの通知をリスンできるようにします。
  2. すべてのリスナで実装する必要のある handleNotification メソッドは、クラスの最後にあります。

  3. weblogic.management.timer.Timer MBean をインスタンス化します。
  4. 通知リスナとして Timer MBean に登録します。
  5. addNotification メソッドを呼び出します。
  6. Date オブジェクトは、Timer MBean の通知リストに追加された 5 秒後にこの通知の送信が開始されるようにタイマーをコンフィグレーションします。PERIOD 値により、通知が毎分送信されるようになります。

    このクラスは、ユーザ定義の userData オブジェクトとしてアタッチされます。

    Timer MBean が通知を送信するたびに、このオブジェクトの含まれる TimerNotification オブジェクトが送信されます。その Message 属性は文字列 a recurring call、Type 属性は文字列 oneMinuteTimer です。

  7. Timer MBean インスタンスを起動します。

サーブレットを再デプロイまたはアンデプロイするときには、Timer 変数で表される Timer MBean インスタンスの Timer.stop メソッドが呼び出されます。

コード リスト 7-1サーブレット リスナ

import java.util.Date;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.InstanceNotFoundException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import weblogic.management.timer.Timer;
// NotificationListener を実装
public final class LifecycleListener implements ServletContextListener,
               NotificationListener {
    private static final long PERIOD = Timer.ONE_MINUTE;
    private Timer timer;
    private Integer notificationId;
    public void contextInitialized(ServletContextEvent event) {
        System.out.println(">>> contextInitialized called.");
        // Timer MBean をインスタンス化
        timer = new Timer();
        // このクラスをリスナとして登録
        timer.addNotificationListener(this, null, "some handback object");
        // 通知を Timer に追加し、Timer が返す ID を
        // 変数に割り当てる
        Date timerTriggerAt = new Date((new Date()).getTime() + 5000L);
        notificationId = timer.addNotification("oneMinuteTimer",
                         "a recurring call", this,
                         timerTriggerAt, PERIOD);
        timer.start();
        System.out.println(">>> timer started.");
    }
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println(">>> contextDestroyed called.");
        try {
            timer.stop();
            timer.removeNotification(notificationId);
            System.out.println(">>> timer stopped.");
       } catch (InstanceNotFoundException e) {
            e.printStackTrace();
        }
    }
    /* コールバック メソッド */
    public void handleNotification(Notification notif, Object handback) {
            System.out.println(">>> "+(new Date())+
                         " timer handleNotification="+notif+
                         ", handback="+handback);
    }
}

サーブレット リスナのデプロイメント記述子では、<listener> および <listener-class> 文を使用して上の例のクラスを宣言する必要があります。コード リスト 7-2 を参照。

コード リスト 7-2サーブレット リスナのデプロイメント記述子

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
    <listener>
        <listener-class>
            examples.jmxtimer.LifecycleListener
        </listener-class>
    </listener>
</web-app>

 


通知の削除

Timer MBean では、次のいずれかの場合にリストから通知を削除します。

Timer MBean には、通知を削除する以下の API も用意されています。

特定の Timer MBean インスタンスに対してこれらの通知削除 API を使用するには、Timer MBean のインスタンス化に使用するクラスにその API を追加します。コード リスト 7-1timer.start() および timer.stop() の呼び出しと同様に、各 API をメソッドにラップします。たとえば、Timer MBean インスタンスを Timer という変数に割り当てた場合は、次のメソッドをクラスに追加します。

public void removeMyNotification (java.lang.Integer id) {
    timer.removeNotification(id);
}

詳細については、「WebLogic Server の Javadoc」で weblogic.management.timer.Timerを参照してください。

 

ページの先頭 前 次