プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server JMXによる管理可能アプリケーションの開発
12c (12.2.1.2.0)
E82884-01
目次へ移動
目次

前
次

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

この章では、WebLogic Server JMXタイマー・サービスを使用して、JMXクライアントが指定した時間に、または定期的にタスクを実行する方法について説明します。

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

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

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

JDKには、JMXタイマー・サービスの実装(Java SE 7 API仕様javax.management.timer.Timer (http://docs.oracle.com/javase/7/docs/api/javax/management/timer/Timer.html)を参照)が組み込まれていますが、このタイマー・サービスのリスナーは、サーバーの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通知を送信するようにします。Java SE 7 API仕様TimerNotification (http://docs.oracle.com/javase/7/docs/api/javax/management/timer/TimerNotification.html)を参照してください。

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

      「通知を送信するようにタイマーMBeanを構成する」を参照してください

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

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

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

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

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

通知を送信するようにタイマーMBeanを構成する

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

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

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

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

    Java SE 7 API仕様javax.management.ObjectName (http://docs.oracle.com/javase/7/docs/api/javax/management/ObjectName.html)を参照してください。

    オブジェクト名は組織名で開始し、その名前の中にタイマー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でない場合、通知は無限に繰り返されます。

このパラメータを指定すると、タイマー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(); 

Java SE 7 API仕様java.util.Calendar (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html)を参照してください。

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

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

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

  • このコードでは、複数のサーバー・インスタンスにデプロイされているアプリケーションと一緒にJMXクライアントが動作することを前提として、タイマーMBeanがWebLogic Server実行時MBeanサーバーに作成および登録されます。この場合、JMXクライアントはタイマーMBeanをドメイン内の各実行時MBeanサーバーに登録します。

  • WebLogic ServerタイマーMBeanのインスタンスは作成されますが、このクラスはWebLogic Serverクラスをインポートしません。WebLogic Server Timerクラスへのアクセスが必要なのはJMXクライアントではなく、MBeanサーバーだけです。

  • すべてのタイマー通知はjavax.management.Notificationの拡張であるため、汎用のJMXリスナーを使用してタイマー通知をリスニングできます。

例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は、通知を削除する以下の操作も提供します。

  • removeAllNotifications(): タイマーMBeanインスタンスに登録されているすべての通知を削除します。

  • removeNotification(java.lang.Integer id): handbackオブジェクトに指定する整数値が含まれる通知を削除します。addNotificationメソッドは、呼び出された場合に、このhandbackオブジェクトを返します(通知を送信するようにタイマーMBeanを構成するの手順4を参照してください)。

  • removeNotifications(java.lang.String type): タイプが指定のタイプと対応するすべての通知を削除します。通知のタイプ値は、通知オブジェクトの作成時に定義します。表5-1を参照してください。

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