ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMX による管理の容易なアプリケーションの開発
11g リリース 1 (10.3.1)
B55538-01
  ドキュメントのライブラリ

目次
目次

戻る
戻る
 
次へ
次へ
 

5 WebLogic Server JMX タイマー サービスの使用

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

WebLogic Server JMX タイマー サービスの概要

JMX クライアントが指定された時刻または一定期間ごとにタスクを実行する必要がある場合、通知を送信するように JMX タイマー サービスをコンフィグレーションしたり、指定されたアクションで通知に応答するリスナをコンフィグレーションしたりできます。

たとえば、JMX モニタを毎日午前 9 時から午後 9 時まで実行する必要があるとします。この場合、毎日午前 9 時に通知を送信するように JMX タイマー サービスをコンフィグレーションすることによって、JMX リスナからモニタを起動できます。タイマー サービスで午後 9 時に別の通知を送信し、その通知によってリスナからモニタ MBean を停止できます。

JDK には、JMX タイマー サービスの実装 (http://java.sun.com/javase/6/docs/api/javax/management/timer/Timer.htmlJ2SE 6.0 API 仕様の javax.management.timer.Timer を参照)が組み込まれていますが、このタイマー サービスのリスナは、サーバの JVM 内の独自のスレッドで動作します。

WebLogic Server には、標準の JMX タイマー サービスの拡張が組み込まれています。この拡張では、タイマー リスナは WebLogic Server が管理するスレッドおよび WebLogic Server ユーザ アカウントのセキュリティ コンテキストの中で実行されます。

タイマー サービスの作成 : 主な手順

各 JMX クライアントに対して、タイマー サービスのインスタンスを構築および管理します。WebLogic Server にはすべての JMX クライアントが使用する集中型タイマー サービスは用意されていません。サーバ インスタンスが再起動するたびに、各 JMX クライアントは必要なタイマー サービスのコンフィグレーションを再インスタンス化する必要があります。

WebLogic Server タイマー サービスを作成するには、次の手順に従います。

  1. アプリケーションに JMX リスナ クラスを作成します。

    JMX リスナの作成については、『Oracle Fusion Middleware Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の「通知リスナを作成する」を参照してください。

  2. 以下のことを行うクラスを作成します。

    1. weblogic.management.timer.TimerMBean のインスタンスをコンフィグレーションして、指定の時間または間隔で javax.management.timer.TimerNotification 通知を送信するようにする。http://java.sun.com/javase/6/docs/api/javax/management/timer/TimerNotification.html にある『J2SE 6.0 API 仕様』の「TimerNotification」を参照してください。

      コンフィグレーションする通知ごとに、タイマーによる通知の送信を引き起こすイベントを識別する StringType 属性に組み込みます。

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

    2. コンフィグレーションしたタイマー MBean にリスナとフィルタ (任意) を登録する。

    3. コンフィグレーションしたタイマー MBean でタイマーを起動する。

      全般的な手順については、『Oracle Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発』の「通知フィルタをコンフィグレーションする」および「通知リスナとフィルタを登録する」を参照してください。

    4. タイマー サービスの使用後にタイマー MBean の登録を解除し、MBean サーバとの接続を閉じる。

  3. リスナとその他の JMX クラスをパッケージ化し、WebLogic Server にデプロイします。『Oracle Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発』の「リスナをパッケージ化し、WebLogic Server にデプロイする」を参照してください。

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

Timer MBean インスタンスが通知を送信するようにコンフィグレーションするには、次の手順に従います。

  1. ドメイン実行時 MBean サーバへの接続を初期化します。

    Oracle Fusion Middleware Oracle Weblogic Server JMX によるカスタム管理ユーティリティの開発』の「MBean サーバへのリモート接続の作成」を参照してください。

  2. タイマー MBean インスタンスの ObjectName を作成します。

    http://java.sun.com/javase/6/docs/api/javax/management/ObjectName.html にある『J2SE 6.0 API 仕様』の「javax.management.ObjectName」を参照してください。

    オブジェクト名は組織名で開始し、その名前の中にタイマー MBean インスタンスの目的を明確に特定する主要プロパティを含めることをお勧めします。

    たとえば、"mycompany:Name=myDailyTimer,Type=weblogicTimer" というように指定します。

  3. タイマー MBean を作成および登録します。

    javax.management.MBeanServerConnection.createMBean(String classname ObjectName name) メソッドを使用します。ここで、

    • classnameweblogic.management.timer.Timer

    • name はタイマー MBean インスタンスのオブジェクト名


      注意 :

      作成するタイマー MBean は、WebLogic Server の JMX エージェントで動作します (リモート JMX クライアントからタイマー MBean を作成した場合はクライアント JVM で動作しません)。

  4. 通知を送信するようにタイマー MBean をコンフィグレーションします。

    MBean の addNotification オペレーションを呼び出します。表 5-1 に、addNotification オペレーションの各パラメータの説明を示します。詳細については、『WebLogic Server API リファレンス』の「weblogic.management.timer.Timer」を参照してください。

    addNotification オペレーションは TimerNotification オブジェクトを作成し、その TimerNotification オブジェクトを一意に識別する整数が含まれる Integer 型の handback オブジェクトを返します。

  5. JMX クライアントが受信する必要があるタイマー通知ごとに手順 4 を繰り返します。

  6. タイマー MBean の start() オペレーションを呼び出して、そのタイマーを起動します。

指定した時刻になると、タイマー サービスは TimerNotification オブジェクトを handback オブジェクトの参照と一緒に送信します。

表 5-1 addNotification オペレーションのパラメータ

パラメータ 説明
java.lang.String type

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

java.lang.String message

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

java.lang.Object userData

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

java.util.Date startTime

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

Date オブジェクトの作成」を参照。

long period

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

long nbOccurences

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

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


Date オブジェクトの作成

java.util.Date オブジェクトのコンストラクタは、そのオブジェクトを初期化して、Date オブジェクトの作成時間 (最も近いミリ秒) を格納します。異なる日時を指定するには、次の手順に従います。

  1. java.util.Calendar のインスタンスを作成します。

  2. Calendar オブジェクトが時刻または日付を表すようにコンフィグレーションします。

  3. Calendar オブジェクトの getTime() メソッドを呼び出します。このメソッドは、Calendar オブジェクトの時刻を表す Date オブジェクトを返します。

たとえば、次のコードでは、午前 0 時を表す Date オブジェクトがコンフィグレーションされます。

java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(java.util.Calendar.HOUR_OF_DAY, 24);
java.util.Date morning = cal.getTime(); 

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html にある『J2SE 6.0 API 仕様』の「java.util.Calendar」を参照してください。

例 : 通知を午前 9 時から 5 分ごとに生成する

コード リスト 5-1 のコードでは、午前 9 時から 5 分ごとに通知を送信する weblogic.management.timer.Timer のインスタンスが作成されます。

コードに関する以下の点に留意してください。

コード リスト 5-1 タイマー MBean の作成、登録、コンフィグレーション

import java.util.Hashtable;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.MalformedObjectNameException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

import javax.management.NotificationFilterSupport;

public class RegisterTimer  {
   private static MBeanServerConnection connection;
   private static JMXConnector connector;
   private static final ObjectName service;

   // クラス全体で使用できるように RuntimeServiceMBean
   // のオブジェクト名を初期化する
   static {
      try {
         service = new ObjectName(
         "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.ru
          ntime.RuntimeServiceMBean");
      }catch (MalformedObjectNameException e) {
         throw new AssertionError(e.getMessage());
      }
   }

   /*
    * 実行時 MBean サーバへの接続を初期化する
    * この MBean は実行時 MBean 階層のルートであり、
    * ドメイン内の各サーバは独自のインスタンスをホストする
    */
   public static void initConnection(String hostname, String portString, 
      String username, String password) throws IOException,
      MalformedURLException { 
      String protocol = "t3";
      Integer portInteger = Integer.valueOf(portString);
      int port = portInteger.intValue();
      String jndiroot = "/jndi/";
      String mserver = "weblogic.management.mbeanservers.runtime";
      JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port,
         jndiroot + mserver);

      Hashtable h = new Hashtable();
      h.put(Context.SECURITY_PRINCIPAL, username);
      h.put(Context.SECURITY_CREDENTIALS, password);
      h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
         "weblogic.management.remote");
      connector = JMXConnectorFactory.connect(serviceURL, h);
      connection = connector.getMBeanServerConnection();
   }

   public static void main(String[] args) throws Exception {
      String hostname = args[0];
      String portString = args[1];
      String username = args[2];
      String password = args[3];

      try {
         /* 実行時 MBean サーバへの接続を確立するカスタム メソッドを起動し、
          * MBeanServerConnection のインスタンスを 
          * 使用して接続を表現する。カスタム メソッドは
          * MBeanServerConnection を 
          * クラス全体のスタティック変数「connection」に代入する
         */
         initConnection(hostname, portString, username, password);

         //タイマー MBean を作成および登録する
         ObjectName timerON = new
            ObjectName("mycompany:Name=myDailyTimer,Type=weblogicTimer");
         String classname = "weblogic.management.timer.Timer";
         connection.createMBean(classname, timerON);
         System.out.println("===> created timer mbean "+timerON);

         // タイマー MBean をコンフィグレーションして朝の通知を送信する
         // addNotification の戻り値を変数に代入して、
         // この特定の通知に対する他のオペレーションを
         // 呼び出せるようにする
         java.util.Calendar cal = java.util.Calendar.getInstance();
         cal.set(java.util.Calendar.HOUR_OF_DAY, 9);
         java.util.Date morning = cal.getTime();
         String myData = "Timer notification";
         Integer morningTimerID = (Integer) connection.invoke(timerON,
            "addNotification",
            new Object[] { "mycompany.timer.notification.after9am" , 
            "After 9am!", myData, morning, new Long(300000) },
            new String[] {"java.lang.String", "java.lang.String",
            "java.lang.Object", "java.util.Date", "long" });

         //リスナ クラスをインスタンス化し、タイマー メッセージだけが、
         // 転送されるようにフィルタをコンフィグレーションする
         MyListener listener = new MyListener();
         NotificationFilterSupport filter = new NotificationFilterSupport();
         filter.enableType("mycompany.timer");    

         //MBean サーバの addNotificationListener メソッドを使用して
         //リスナとフィルタをタイマー MBean に登録する
         System.out.println("===> ADD NOTIFICATION LISTENER TO "+ timerON);
         connection.addNotificationListener(timerON, listener, filter, null);
         System.out.println("\n[myListener]: Listener registered ...");

         //タイマーを起動する
         connection.invoke(timerON, "start", new Object[] { }, new String[] {});

         //リモート クライアントをアクティブに保つ
         System.out.println("Pausing. Press Return to end...........");
         System.in.read();
      } catch(Exception e) {
         System.out.println("Exception: " + e);
         e.printStackTrace();
      }
   }
}

通知の削除

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

タイマー MBean は、通知を削除する以下のオペレーションも提供します。

詳細については、『WebLogic Server API リファレンス』の「weblogic.management.timer.Timer」を参照してください。