ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMXによる管理の容易なアプリケーションの開発
11gリリース1 (10.3.6)
B55538-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. weblogic.management.timer.TimerMBeanのインスタンスを構成して、指定の時間または間隔でjavax.management.timer.TimerNotification通知を送信するようにします。http://download.oracle.com/javase/6/docs/api/javax/management/timer/TimerNotification.htmlにあるJava SE 6.0 API仕様の「TimerNotification」を参照してください。

      構成する通知ごとに、タイマーによる通知の送信を引き起こすイベントを識別するStringType属性に組み込みます。

      「通知を送信するようにTimer MBeanを構成する」を参照してください。

    2. 構成したタイマーMBeanにリスナーとフィルタ(任意)を登録します。

    3. 構成したタイマーMBeanでタイマーを起動します。

      全般的な手順については、『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の通知フィルタの構成に関する項および通知リスナーとフィルタの登録に関する項を参照してください。

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

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

通知を送信するようにTimer MBeanを構成する

Timer MBeanインスタンスが通知を送信するように構成するには、次の手順に従います。

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

    『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』のMBeanサーバーへのリモート接続に関する項を参照してください。

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

    http://download.oracle.com/javase/6/docs/api/javax/management/ObjectName.htmlにあるJava SE 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://download.oracle.com/javase/6/docs/api/java/util/Calendar.htmlにあるJava SE 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;

   // Initialize the object name for RuntimeServiceMBean
   // so it can be used throughout the class.
   static {
      try {
         service = new ObjectName(
         "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.ru
          ntime.RuntimeServiceMBean");
      }catch (MalformedObjectNameException e) {
         throw new AssertionError(e.getMessage());
      }
   }

   /*
    * Initialize connection to the Runtime MBean Server.
    * This MBean is the root of the runtime MBean hierarchy, and
    * each server in the domain hosts its own instance.
    */
   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 {
         /* Invokes a custom method that establishes a connection to the
          * Runtime MBean Server and uses an instance of 
          * MBeanServerConnection to represents the connection. The custom
          * method assigns the MBeanServerConnection to a class-wide, static
          * variable named "connection".
         */
         initConnection(hostname, portString, username, password);

         //Creates and registers the timer 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);

         // Configures the timer MBean to emit a morning notification.
         // Assigns the return value of addNotification to a variable so that
         // it will be possible to invoke other operations for this specific
         // notification.
         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" });

         //Instantiates your listener class and configures a filter to
         // forward only timer messages.
         MyListener listener = new MyListener();
         NotificationFilterSupport filter = new NotificationFilterSupport();
         filter.enableType("mycompany.timer");    

         //Uses the MBean server's addNotificationListener method to
         //register the listener and filter with the timer MBean.
         System.out.println("===> ADD NOTIFICATION LISTENER TO "+ timerON);
         connection.addNotificationListener(timerON, listener, filter, null);
         System.out.println("\n[myListener]: Listener registered ...");

         //Starts the timer.
         connection.invoke(timerON, "start", new Object[] { }, new String[] {});

         //Keeps the remote client active.
         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」を参照してください。