JMX によるカスタム管理ユーティリティの開発

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

通知とモニタ MBean の使い方

JMX には MBean をモニタする 2 つの方法があります。特定のイベント (属性値の変更など) が発生したときに通知を送信する方法、または、モニタ MBean という特別なタイプの MBean が別の MBean をポーリングして、属性値について記述した通知を定期的に送信する方法です。これらの通知をリスンしたり、適切に応答したりするリスナという Java クラスを作成します。たとえば、アプリケーションのデプロイ、アンデプロイ、再デプロイ時に通知を受信するリスナを管理ユーティリティに組み込むことができます。

すべての WebLogic Server コンフィグレーション MBean と一部の実行時 MBean は、属性値が変わるときに通知を送信します。

以下の節では、通知およびリスナの使い方について説明します。

 


ベスト プラクティス : 直接的なリスンとモニタ

モニタする MBean が通知を送信する場合は、MBean における変更をリスンするリスナ オブジェクトを作成するか、MBean を定期的にポーリングして、属性値が特定の方法で変更された場合にのみ通知を送信するモニタ MBean を作成するかを選択することができます。どちらの方法を選ぶかは、主に通知を受信する状況の複雑さによって決まります。

要件が単純な場合は、MBean からリスナに通知が送信され、変更が直ちに通知されるので、リスナを直接 MBean に登録する方法が適しています。ただし、リスナと省略可能なフィルタ (javax.management.NotificationListener および NotificationFilter) を実装する基本クラスには、値をしきい値や他の値と比較する機能がほとんどありません (J2SE 5.0 API 仕様の javax.management パッケージを参照)。

通知の要件が複雑な場合や、MBean 属性値の 1 つの変更に直接関連付けられない一連の変更をモニタする場合は、モニタ MBean を使用します (J2SE 5.0 API 仕様の javax.management.monitor パッケージを参照)。モニタ MBean には、データを比較して、特定の状況でのみ通知を送信するツールが豊富に用意されています。ただし、モニタは観察対象 MBean で属性値の変更を定期的にポーリングし、変更の通知は指定したポーリング間隔でのみ受けられます。

 


ベスト プラクティス : WebLogic Server イベントのリスン

WebLogic Server JMX エージェントと WebLogic Server MBean は、さまざまなタイプのイベントに応じてさまざまな型の通知オブジェクトを送信します。ほとんどのイベント タイプは複数の MBean をトリガして、イベント プロセスのさまざまな時点で通知を送信します。表 7-1 では、一般的なイベント タイプについて説明し、通知をリスンするために JMX モニタ アプリケーションが登録すべき推奨 MBean を示しています。

注意 : 各 JMX 通知オブジェクトには、ドット区切りの文字列を格納する Type という属性があります。この Type 属性の説明と通知のオブジェクト型を混同しないようにしてください。
注意 : Type 属性によって、通知の分類やフィルタ処理を行うことができます。たとえば、カスタム MBean が通知を送信する場合、JMX の規約では、通知オブジェクトの Type 属性を、mycompany.myapp.valueIncreased という企業名で始まる文字列に設定するように勧めています。
注意 : すべての JMX 通知オブジェクトは javax.management.Notification オブジェクト型を拡張します。JMX と WebLogic Server では javax.management.AttributeChangeNotification などの追加の通知オブジェクト型を定義しています。追加のオブジェクト型には、さまざまなタイプのイベントに適した特殊な情報が含まれています。Notification のサブクラスのリストについては、J2SE 5.0 API 仕様の「javax.management.Notification」を参照してください。また、WebLogic Server API リファレンスの「weblogic.management.logging.WebLogicLogNotification」も参照してください。

表 7-1 イベント通知オブジェクト
イベント
リスニングの推奨事項
WebLogic Server インスタンスが起動する、停止する
サーバの起動または停止時に通知を受信するには、リスナをドメイン実行時 MBean サーバ内の各サーバの ServerLifeCycleRuntimeMBean に登録して、AttributeChangeNotificationFilter をコンフィグレーションする。
ドメイン内の各サーバには独自の ServerLifeCycleRuntimeMBean があり、そのサーバがアクティブでない場合でも、ドメイン実行時 MBean サーバから利用できる。サーバ インスタンスを起動すると、そのサーバの ServerLifeCycleRuntimeMBeanState 属性の値を更新して、AttributeChangeNotification を送信する。
このようなリスナとフィルタの例については、「WebLogic Server MBean からの通知のリスン : 主な手順」を参照。

注意 : この推奨事項では、管理対象サーバを起動する前にドメインの管理サーバを起動することを前提としている。管理サーバよりも前に管理対象サーバを起動すると、管理対象サーバの ServerLifeCycleRuntimeMBean の状態が RUNNING に変わるときにドメインの実行時 MBean サーバ (管理サーバ上でのみ動作する) が初期化されない。管理サーバが最初に起動することを保証できない場合は、JMX タイマー サービスを使用し、ドメイン実行時 MBean サーバに対して、オブジェクト名に Type=ServerRuntime キー プロパティが含まれる MBean があるかどうかを定期的に問い合わせる。このクエリに一致する MBean は、各サーバ インスタンスが起動プロセス中に作成した ServerRuntimeMBean である。新しく作成された ServerRuntimeMBean がクエリで見つかった場合、新しいサーバ インスタンスが起動されたことになる。「MBeanServerConnection queryNames」を参照。

WebLogic Server リソースが作成される、破棄される
サーバや JDBC データ ソースなどのリソースを作成するときに、WebLogic Server はリソースのコンフィグレーション MBean を MBean サーバに登録する。リソースを削除するときに、コンフィグレーション MBean の登録を解除する。
MBean の登録と登録解除をリスンするには、javax.management.MBeanServerDelegate にリスナを登録する。
これにより、MBean が登録または登録解除されると javax.management.MBeanServerNotification 型の通知が送信される。
編集 MBean サーバ内の MBeanServerDelegate にリスナを登録した場合は、保留中の MBean 階層が変更されたときに通知を受信する。
実行時 MBean サーバまたはドメイン実行時 MBean サーバにリスナを登録した場合は、保留中の変更がドメインで正常にアクティブ化されたときにのみ通知を受信する。コンフィグレーション データのモニタにのみ関心があり、実行時統計のモニタには関心がない場合は、リスナを実行時 MBean サーバにのみ登録する。「ベスト プラクティス : MBean サーバの選択」を参照。
WebLogic Server リソースのコンフィグレーションが変更される
すべてのコンフィグレーション MBean は、属性値が変わるときに AttributeChangeNotification 型の通知を送信する。
この通知を受信するには、ドメイン実行時 MBean サーバまたは実行時 MBean サーバ内の MBean にリスナを登録する (「ベスト プラクティス : MBean サーバの選択」を参照)。
編集 MBean サーバ内の MBean に登録した場合は、保留中の MBean 階層が変更されたときに通知を受信する。
実行時 MBean サーバまたはドメイン実行時 MBean サーバにリスナを登録した場合は、保留中の変更がドメインで正常にアクティブ化されたときにのみ通知を受信する。コンフィグレーション データのモニタにのみ関心があり、実行時統計のモニタには関心がない場合は、リスナを実行時 MBean サーバにのみ登録する。「ベスト プラクティス : MBean サーバの選択」を参照。
WebLogic Server リソースの実行時状態が変わる
一部の実行時 MBean は、属性値が変わるときに AttributeChangeNotification 型の通知を送信する。この通知を受信するには、ドメイン実行時 MBean サーバ内の MBean にリスナを登録する。
実行時 MBean が通知を送信しない場合は、実行時 MBean をポーリングするモニタ MBean を作成できる。「モニタ MBean を使用した変更の観察 : 主な手順」を参照。
WebLogic Server リソースがログ メッセージを送信する
WebLogic Server リソースがログ メッセージを送信するとき、サーバの weblogic.management.runtime.LogBroadcasterRuntimeMBeanweblogic.management.logging.WebLogicLogNotification 型の通知を送信する。これは、標準の javax.management.Notification クラスとしてキャストできる。
ログ メッセージの通知をリスンするには、LogBroadcasterRuntimeMBean にリスナを登録する。標準の JMX 通知をリスンできる。または、ログ メッセージの詳細情報を取得する場合は、詳細情報の取得に使用できるメソッドを備えた WebLogicLogNotification をリスンできる。WebLogicLogNotification をリスンするには、この WebLogic Server クラスをリスナ クラスにインポートする必要がある。
WebLogic Server リソースが生成するエラー メッセージのリストについては、WebLogic Server メッセージ カタログを参照。
詳細については、WebLogic Server API リファレンスの「WebLogicLogNotification」を参照。

 


ベスト プラクティス : WebLogic Server 実行時統計のリスンまたはモニタ

WebLogic Server MBean は、サービスやリソースの実行時状態に関する詳細な統計を提供します。表 7-2 の統計は、WebLogic Server のパフォーマンスの概要を提供するものです。これらの統計の変化をリスンするには、リスナを作成して、属性が含まれる MBean にリスナを直接登録します。または、モニタ MBean をコンフィグレーションして、重要だと判断した統計のみを定期的にポーリングして報告させることもできます。「通知リスナとフィルタを登録する」および「モニタとリスナを登録する」を参照してください。

表 7-2 一般的にモニタされる WebLogic Server 実行時統計
追跡する統計
リスンまたはモニタする MBean 属性
サーバの現在の状態
MBean タイプ : ServerLifeCycleRuntimeMBean
属性名 : State
サーバのリスン ポートのアクティビティ
MBean タイプ : ServerRuntimeMBean
属性名 : OpenSocketsCurrentCount
MBean タイプ : ServerMBean
属性名 : AcceptBacklog
この 2 つの属性を一緒に使用して、サーバのリスン ポートにおける現在のアクティビティと、ポート上でバックログできるリクエストの総数を比較する。
メモリとスレッドの使用状況
MBean タイプ : ThreadPoolRuntimeMBean
属性名 : ExecuteThreadIdleCount
メモリ領域を占有しているがデータの処理には使用されていない、サーバの実行キューのスレッド数を示す。
MBean タイプ : ThreadPoolRuntimeMBean
属性名 : PendingUserRequestCount
サーバの実行キューで待機するユーザ リクエスト数を示す。
MBean タイプ : JVMRuntimeMBean
属性名 : HeapSizeCurrent
サーバの JVM ヒープで現在使用可能なメモリ量 (バイト単位) を示す。
データベース接続
MBean タイプ : JDBCDataSourceRuntimeMBean
属性名 : ActiveConnectionsCurrentCount
JDBC 接続プールでの現在アクティブな接続数を示す。
MBean タイプ : JDBCDataSourceRuntimeMBean
属性名 : ActiveConnectionsHighCount
JDBC 接続プールのアクティブな接続の最大数。この数は、接続プールがインスタンス化されるたびにゼロから開始する。
MBean タイプ : JDBCDataSourceRuntimeMBean
属性名 : LeakedConnectionCount
リークされた接続の総数を示す。リークされた接続は、チェックアウト済みの接続だが、close() 呼び出しを通じて接続プールに返されない。リークされた接続はその後の接続リクエストの遂行に使用できないので、その総数をモニタすることは重要である。
MBean タイプ : JDBCDataSourceRuntimeMBean
属性名 : ConnectionDelayTime
接続プールに接続する平均時間を示す。
MBean タイプ : JDBCDataSourceRuntimeMBean
属性名 : FailuresToReconnectCount
接続プールがデータ ストアへの再接続に失敗した場合を示す。アプリケーションでは、この属性がインクリメントしたり、しきい値に達したりすると、許容できる中断時間のレベルに応じてリスナに通知できる。

 


WebLogic Server MBean からの通知のリスン : 主な手順

MBean が送信する通知を直接リスンするには、次の手順に従います。

  1. アプリケーションにリスナ クラスを作成します。「通知リスナを作成する」を参照してください。
  2. 通知を受信する MBean にリスナとフィルタ (省略可能) を登録する追加のクラスを作成します。「通知フィルタをコンフィグレーションする」および「通知リスナとフィルタを登録する」を参照してください。
  3. リスナおよび登録クラスをパッケージ化してデプロイします。「リスナをパッケージ化し、WebLogic Server にデプロイする」を参照してください。

通知リスナを作成する

注意 : 私は、2002 年 04月 15 日 に、このセクションと次のセクションを use_logging/use_log.fm に コピーしました。- darren

通知リスナを作成するには、次の手順に従います。

  1. javax.management.NotificationListener を実装するクラスを作成します。
  2. J2SE 5.0 API 仕様の「NotificationListener」を参照してください。

  3. クラス内に NotificationListener.handleNotification(Notification notification, java.lang.Object handback) メソッドを追加します。
  4. 注意 : 通知ブロードキャスタをブロックしないように、このメソッドの実装はできるだけ早く復帰する必要があります。
  5. (省略可能) ほとんどの場合、MBean が通知オブジェクトを送信したという単純な事実以上のことを知る必要があります。たとえば、通知オブジェクトの Type 属性の値を知ることができます。この値は、通知の送信を引き起こしたイベントのタイプを分類するのに使用します。
  6. 通知オブジェクトから情報を取得するには、handleNotification メソッドの内部で、そのオブジェクトのメソッドを呼び出します。すべての通知型は javax.management.Notification を拡張しているので、Notification の以下のメソッドはすべての通知で使用できます。

    • getMessage()
    • getSequenceNumber()
    • getTimeStamp()
    • getType()
    • getUserData()
    • J2SE 5.0 API 仕様の「Notification」を参照してください。

      ほとんどの通知型は、その通知に固有のデータを取得するための追加のメソッドを提供しています。たとえば、javax.management.AttributeChangeNotification には、値がどのように変化したかを判断するのに使用できる getNewValue()getOldValue() があります。

コード リスト 7-1 は、AttributeChangeNotification のメソッドを使用して、値が変化した属性の名前と古い値および新しい値を取得する簡単なリスナです。

コード リスト 7-1 通知リスナ
import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.AttributeChangeNotification;
public class MyListener implements NotificationListener {
    public  void handleNotification(Notification notification, Object obj) {
        if(notification instanceof AttributeChangeNotification) {
            AttributeChangeNotification attributeChange =
                     (AttributeChangeNotification) notification;
            System.out.println("This notification is an
                      AttributeChangeNotification");
            System.out.println("Observed Attribute: " +
                                       attributeChange.getAttributeName() );
            System.out.println("Old Value: " + attributeChange.getOldValue() );
            System.out.println("New Value: " + attributeChange.getNewValue() );
        }
    }
}

リモート JVM からのリスン

JMX 1.2 では、リスンする MBean とは別の JVM で動作するリスナのプログラミングに関する特別な要件はありません。

(javax.management.MBeanServerConnection を使用して) リモート JMX エージェントへの接続を確立すると、JMX によって JVM 間のデータの共有が処理されます。リモート JVM から接続を確立する手順については、「通知リスナとフィルタを登録する」を参照してください。

ベスト プラクティス : 通知リスナの作成

NotificationListener クラスを作成するときに、以下の推奨事項を考慮してください。

通知フィルタをコンフィグレーションする

JDK 1.5 では、指定する条件に一致した通知を転送するようにコンフィグレーションできる、簡単なフィルタ クラスが 2 つ用意されています。JDK のフィルタ クラスをコンフィグレーションするには、次の手順に従います。

  1. リスナを MBean に登録するクラスで、javax.management.NotificationFilterSupport または AttributeChangeNotificationFilter のインスタンスを作成します。
  2. フィルタ クラスのメソッドを呼び出して、フィルタ条件を指定します。
  3. J2SE 5.0 API 仕様の「NotificationFilterSupport」または「AttributeChangeNotificationFilter」を参照してください。

たとえば、以下のコード行では、State という属性で変更があった場合にのみ属性変更通知を転送する AttributeChangeNotificationFilter をコンフィグレーションします。

AttributeChangeNotificationFilter filter =
   new AttributeChangeNotificationFilter();
filter.enableAttribute("State");

カスタム フィルタの作成

JDK のフィルタ クラスでは単純過ぎて要件に合わない場合は、より高度なカスタム フィルタ クラスを作成できます (J2SE 5.0 API 仕様の「NotificationFilter」を参照)。ただし、カスタム フィルタを使用すると、リスナおよびフィルタのパッケージ化とデプロイメントが複雑になるため、できる限り JDK のフィルタ クラスを使用することをお勧めします。「リスナをパッケージ化し、WebLogic Server にデプロイする」を参照してください。

通知リスナとフィルタを登録する

通知リスナ クラスを実装したら、MBean インスタンスにリスナを登録する (また、必要に応じてフィルタをコンフィグレーションして登録する) 追加のクラスを作成します。

通知リスナとフィルタを MBean に登録するには、次の手順に従います。

  1. 実行時 MBean サーバまたはドメイン実行時 MBean サーバへの接続を初期化します。
  2. MBean サーバへのリモート接続の作成」を参照してください。

  3. WebLogic Server MBean に登録するには、MBean 階層を移動して、リスンする MBean のオブジェクト名を取得します。「MBean 階層内の移動」を参照してください。
  4. カスタム MBean に登録するには、その MBean の JMX オブジェクト名を含む ObjectName を作成します。J2SE 5.0 API 仕様の「javax.management.ObjectName」を参照してください。

  5. 作成したリスナ クラスをインスタンス化します。
  6. (省略可能) JDK のフィルタ クラスのいずれかをインスタンス化してコンフィグレーションします。または、カスタム クラスをインスタンス化します。
  7. MBean のオブジェクト名、リスナ クラス、およびフィルタ クラスを MBeanServerConnection.addNotificationListener (
    ObjectName
    name, ObjectName listener, NotificationFilter filter,
    Object
    handback) メソッドに渡して、リスナとフィルタを登録します。

サンプル クラスでは、コード リスト 7-1 のリスナと JDK の AttributeChangeNotificationFilter を、ドメインの ServerLifeCycleRuntimeMBean に登録します。このクラスでは handback オブジェクトは渡しません。

このサンプルで、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。MBean の表示や変更を行うパーミッションの詳細については、『ロールおよびポリシーによる WebLogic リソースの保護』の「ユーザ、グループ、セキュリティ ロール」を参照してください。

サンプル クラスには、RegisterListener クラスをアクティブに保ち、メイン プログラムを終了しないコードも含まれています。リスナ クラスは、クラスの呼び出しとアクティブの維持を行う、より大きなアプリケーションのコンテキストで動作するため、このコードは通常は必要ありません。ここでは、簡単にコンパイルしてサンプルの機能を確認できるように含まれています。

コード リスト 7-2 ServerLifeCycleRuntimeMBean へのリスナの登録
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.AttributeChangeNotificationFilter;
public class RegisterListener {
   private static MBeanServerConnection connection;
   private static JMXConnector connector;
   private static final ObjectName service;
   // DomainRuntimeServiceMBean のオブジェクト名を初期化して
   // クラス内で使用できるようにする
   static {
      try {
         service = new ObjectName(
         "com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanserv
          ers.domainruntime.DomainRuntimeServiceMBean");
      }catch (MalformedObjectNameException e) {
         throw new AssertionError(e.getMessage());
      }
   }
   /*
    * ドメインの実行時 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.domainruntime";
      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();
   }
   /*
    * ServerLifeCycleRuntimeMBean の配列を取得する
    */
   public static ObjectName[] getServerLCRuntimes() throws Exception {
      ObjectName domainRT = (ObjectName) connection.getAttribute(service,
         "DomainRuntime");
      return (ObjectName[]) connection.getAttribute(domainRT,
         "ServerLifecycleRuntimes");
   }
   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 {
         // リスナ クラスをインスタンス化する
         MyListener listener = new MyListener();
         AttributeChangeNotificationFilter filter =
            new AttributeChangeNotificationFilter();
         filter.enableAttribute("State");
         initConnection(hostname, portString, username, password);
         // MBean の名前とリスナ クラスを
         // MBeanServer の addNotificationListener メソッドに渡す
         ObjectName[] serverLCRT = getServerLCRuntimes();
         int length= (int) serverLCRT.length;
         for (int i=0; i < length; i++) {
            connection.addNotificationListener(serverLCRT[i], listener,
               filter, null);
            System.out.println("\n[myListener]: Listener registered with"
               +serverLCRT[i]);
         }
      // リモート クライアントをアクティブに保つ
         System.out.println("pausing...........");
         System.in.read();
      } catch(Exception e) {
         System.out.println("Exception: " + e);
      }
   }
}

リスナをパッケージ化し、WebLogic Server にデプロイする

JMX リスナは、リモート アプリケーションとして、WebLogic Server 起動クラスとして (サーバが起動するとすぐにリスナが使用可能になる)、または WebLogic Server にデプロイする他のアプリケーションの内部に、パッケージ化してデプロイできます。

JDK のフィルタを使用する場合は、フィルタ クラスをパッケージ化する必要はありません。常に JDK から使用できるようになっています。

表 7-3 では、リスナとカスタム フィルタをパッケージ化してデプロイする方法について説明します。

表 7-3 リスナとカスタム フィルタのパッケージ化とデプロイ
リスナのデプロイ方法
リスナに関する手順
カスタム フィルタに関する手順
リモート アプリケーションとして
リスナのクラスをクライアントのクラスパスで使用可能にする。
フィルタのクラスをクライアントのクラスパスで使用可能にする。
また、モニタする MBean をホストしている各サーバ インスタンスのクラスパスにフィルタ クラスを追加する。それには、クラスを JAR ファイルにアーカイブして、その JAR を各サーバの lib ディレクトリにコピーする。『ドメインのコンフィグレーションについて』の「ドメイン ディレクトリの内容」を参照。
WebLogic Server 起動クラスとして
リスナ クラスをサーバのクラスパスに追加する。それには、クラスを JAR ファイルにアーカイブして、その JAR をサーバの lib ディレクトリにコピーする。
フィルタ クラスをサーバのクラスパスに追加する。それには、クラスを JAR ファイルにアーカイブして、その JAR をサーバの lib ディレクトリにコピーする。『ドメインのコンフィグレーションについて』の「ドメイン ディレクトリの内容」を参照。
WebLogic Server にデプロイするアプリケーションの一部として
リスナ クラスをアプリケーションと一緒にパッケージ化する。
リスナ クラスをアプリケーションと一緒にパッケージ化する。
また、モニタする MBean をホストしている各サーバ インスタンスのクラスパスにフィルタ クラスを追加する。それには、次のいずれかを行う。

例 : コンフィグレーション MBean の登録のリスン

サーバや JDBC データ ソースなどの WebLogic Server リソースを作成すると、WebLogic Server はコンフィグレーション MBean を作成してドメイン実行時 MBean サーバに登録します。

これらのイベントをリスンするには、リスナを javax.management.MBeanServerDelegate に登録します。これにより、MBean が登録または登録解除されるたびに、
javax.management.MBeanServerNotification 型の通知が送信されます。J2SE 5.0 API 仕様の「MBeanServerDelegate」を参照してください。

コード リスト 7-3 のサンプル リスナに関する以下の点に注意してください。

コード リスト 7-4 では、登録クラスのメソッドを示します。以下の点に注意してください。

これらのメソッドをコンパイルして実行するには、コード リスト 7-2 の補助的なカスタム メソッドを使用し、生成されたクラスをリモート JMX クライアントとして実行します。

コード リスト 7-4 例 : MBeanServerDelegate へのリスナの登録
public static void main(String[] args) throws Exception {
   String hostname = args[0];
   String portString = args[1];
   String username = args[2];
   String password = args[3];
   ObjectName delegate = new ObjectName(
      "JMImplementation:type=MBeanServerDelegate");
   try {
      // リスナ クラスをインスタンス化する
      StartStopListener slistener = new StartStopListener();
      NotificationFilterSupport filter = new NotificationFilterSupport();
      filter.enableType("JMX.mbean.registered");
      filter.enableType("JMX.mbean.unregistered");
      /* ドメイン実行時 MBean サーバへの接続を確立する
       * カスタム メソッドを呼び出し、
       * MBeanServerConnection のインスタンスを使用して接続を表す。
       * カスタム メソッドは MBeanServerConnection を、
       * クラス全体の静的変数「connection」に割り当てる
       */
      initConnection(hostname, portString, username, password);
      // MBean の名前とリスナ クラスを
      // MBeanServer の addNotificationListener メソッドに渡す
      connection.addNotificationListener(delegate, slistener, filter,
         null);
      System.out.println("\n[myListener]: Listener registered ...");
      // リモート クライアントをアクティブに保つ
      System.out.println("pausing...........");
      System.in.read();
   } catch (Exception e) {
      System.out.println("Exception: " + e);
   }
}
// 登録される JDBCDataSourceRuntimeMBean の通知を受信した場合に
// リスナによって呼び出される
public static void registerwithJDBCDataSourceRuntime(ObjectName mbname) {
   try {
      MyListener mylistener = new MyListener();
      AttributeChangeNotificationFilter filter =
         new AttributeChangeNotificationFilter();
      filter.enableAttribute("Enabled");
      connection.addNotificationListener(mbname, mylistener, 
         filter, null);
   } catch (Exception e) {
      System.out.println("Exception: " + e);
   }
}

 


モニタ MBean を使用した変更の観察 : 主な手順

モニタ MBean をコンフィグレーションして使用するには、次の手順に従います。

  1. モニタの要件に合うモニタ MBean タイプを選択します。「モニタ MBean のタイプと通知の型を選択する」を参照してください。
  2. モニタ MBean からの通知をリスンできるリスナ クラスを作成します。「モニタ MBean 用の通知リスナを作成する」を参照してください。
  3. モニタ MBean の作成、登録、およびコンフィグレーション、リスナ クラスのモニタ MBean への登録、モニタ MBean の起動を行うクラスを作成します。「モニタとリスナを登録する」を参照してください。

モニタ MBean のタイプと通知の型を選択する

JMX では、特定のタイプの変更を観察する特別なモニタ MBean を提供しています。

すべてのモニタ MBean は javax.management.monitor.MonitorNotification 型の通知を送信します。モニタ MBean は通知を生成するときに、特定の値を通知の Type プロパティに書き込んで、通知を生成したイベントについて記述します。表 7-4 では、さまざまなタイプのモニタ MBean がエンコードする Type プロパティの値について説明します。フィルタまたはリスナは通知の getType() メソッドを使用して、Type プロパティ内の String を取得します。

表 7-4 モニタ MBean と MonitorNotification の Type プロパティ
モニタ MBean のタイプ
MonitorNotification の Type プロパティ内にエンコードされる文字列
CounterMonitor
jmx.monitor.counter.threshold - カウンタの値がしきい値 (比較レベル) に到達したか、またはそれを超えた場合。
GaugeMonitor
  • jmx.monitor.gauge.high - 観察対象の属性値が増加し、上限しきい値と等しくなるかそれを超えた場合。この属性値が下限しきい値と等しくなるかそれを下回った場合を除き、以後上限しきい値に達しても通知は行われない。
  • jmx.monitor.gauge.low - 観察対象の属性値が減少し、下限しきい値と等しくなるかそれを下回った場合。この属性値が上限しきい値と等しくなるかそれを超えた場合を除き、以後下限しきい値に達しても通知は行われない。
StringMonitor
  • jmx.monitor.string.matches - 観察対象の属性値が比較文字列値と一致した場合。この属性値が比較文字列値と異なる場合を除き、以後この文字列が比較文字列と一致しても通知は行われない。
  • jmx.monitor.string.differs - この属性値が比較文字列値と異なる場合。この属性値が比較文字列値と一致する場合を除き、以後この文字列が比較文字列と異なっても通知は行われない。

エラーと MonitorNotification の Type プロパティ

エラーが発生した場合、すべてのモニタは通知の Type プロパティに以下のいずれかの値をエンコードします。

また、カウンタ モニタとゲージ モニタは、以下のような場合に Type プロパティに jmx.monitor.error.threshold をエンコードできます。

モニタ MBean 用の通知リスナを作成する

観察対象の属性が指定した条件に一致する場合、モニタ MBean は通知を送信します。MonitorNotification 用のリスナを作成するための特別な要件はありません。以下の点を除いて、手順は「通知リスナを作成する」で説明した手順と同じです。

コード リスト 7-5 を参照してください。

コード リスト 7-5 モニタ通知用のリスナ
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
public class MonitorListener implements NotificationListener {
   public void handleNotification(Notification notification, Object obj) {
      if(notification instanceof Notification) {
         Notification notif = (Notification) notification;
         System.out.println("Notification type" + notif.getType() );
         System.out.println("Message: " + notif.getMessage() );
      }
      if (notification instanceof MonitorNotification) {
         MonitorNotification mn = (MonitorNotification) notification;
         System.out.println("Observed Attribute: " +
             mn.getObservedAttribute());
         System.out.println("Trigger: " + mn.getTrigger() );
      }
   }
}

モニタとリスナを登録する

モニタ MBean を使用するには、まず、MBean サーバ内でモニタ MBean のインスタンスを作成して登録する必要があります。次に、作成したモニタ MBean にリスナを登録します。この手順のすべてを 1 つのクラスの中で行うことができます。

モニタ MBean を登録し、リスナを登録して、モニタ MBean を起動するには、次の手順に従います。

  1. ドメイン実行時 MBean サーバへの接続を初期化します。
  2. MBean サーバへのリモート接続の作成」を参照してください。

  3. モニタ MBean インスタンスの ObjectName を作成します。
  4. J2SE 5.0 API 仕様の「javax.management.ObjectName」を参照してください。

    オブジェクト名は組織の名前で始めて、モニタ MBean インスタンスの目的を明確に表すキー プロパティを含めることをお勧めします。

    例 : mycompany:Name=SocketMonitor,Type=CounterMonitor

  5. いずれかのモニタ MBean を作成して登録します。
  6. javax.management.MBeanServerConnection.createMBean(String classname ObjectName name) メソッドを使用します。

    • classname は次のいずれかの値
      javax.management.monitor.CounterMonitor
      javax.management.monitor.GaugeMonitor
      javax.management.monitor.StringMonitor
    • name は、モニタ MBean インスタンス用に作成したオブジェクト名
  7. 属性値を設定して、モニタ MBean をコンフィグレーションします。
  8. 設定する属性のガイドラインについては、J2SE 5.0 API 仕様の javax.management.monitoring パッケージを参照してください。

  9. モニタ MBean がモニタする MBean (観察対象 MBean) を指定するには、モニタ MBean の addObservedObject(ObjectName objectname) および addObservedAttribute(String attributename) オペレーションを呼び出します。
    • objectname は観察対象 MBean の ObjectName
    • attributename はモニタする観察対象 MBean の属性名
    • モニタ MBean の 1 つのインスタンスで複数の MBean をモニタできます。モニタする MBean インスタンスごとに addObservedObject および addObservedAttribute オペレーションを呼び出します。

  10. モニタ MBean 用の通知リスナを作成する」で作成したリスナ オブジェクトをインスタンス化します。
  11. 必要に応じて、フィルタをインスタンス化してコンフィグレーションします。
  12. リスナとフィルタ (省略可能) をモニタ MBean に登録します。リスナを観察対象 MBean には登録しないでください。
  13. モニタ MBean の addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) メソッドを呼び出します。

  14. モニタ MBean の start() オペレーションを呼び出して、モニタを起動します。

例 : CounterMonitorMBean とそのリスナの登録

コード リスト 7-6 では、CounterMonitorMBean を作成およびコンフィグレーションして、ドメインの各 ServerRuntimeMBean インスタンスの SocketsOpenedTotalCount 属性を観察するクラスの main() メソッドを示します (『WebLogic Server MBean リファレンス』の「SocketsOpenedTotalCount」を参照)。

このコード例では、ServerRuntimeMBean の複数のインスタンスをモニタできるように、ドメイン実行時 MBean サーバに接続します。以下の点に注意してください。

この main メソッドをコンパイルして実行するには、コード リスト 7-2 の補助的なカスタム メソッドを使用し、生成されたクラスをリモート JMX クライアントとして実行します。

コード リスト 7-6 例 : CounterMonitorMBean とそのリスナの登録
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 monitorON =
         new ObjectName("mycompany:Name=mySocketMonitor,Type=CounterMonitor");
      String classname = "javax.management.monitor.CounterMonitor";
      System.out.println("===> create mbean "+monitorON);
      connection.createMBean(classname, monitorON);
      // モニタ MBean をコンフィグレーションする
      Number initThreshold = new Long(2);
      Number offset = new Long(1);
      connection.setAttribute(monitorON,
         new Attribute("InitThreshold", initThreshold));
      connection.setAttribute(monitorON, new Attribute("Offset", offset));
      connection.setAttribute(monitorON,
         new Attribute("Notify", new Boolean(true)));
      // モニタする MBean のオブジェクト名を取得する
      ObjectName[] serverRT = getServerRuntimes();
      int length= (int) serverRT.length;
      for (int i=0; i < length; i++) {
         // ServerRuntime MBean の各インスタンスをモニタする MBean として設定する
         System.out.println("===> add observed mbean "+serverRT[i]);
         connection.invoke(monitorON, "addObservedObject",
            new Object[] { serverRT[i] },
            new String[] { "javax.management.ObjectName" });
         Attribute attr = new Attribute("ObservedAttribute",
            "SocketsOpenedTotalCount");
         connection.setAttribute(monitorON, attr);
      }
      // リスナ クラスをインスタンス化し、カウンタ モニタ メッセージのみを
      // 転送するようにフィルタをコンフィグレーションする
      MonitorListener listener = new MonitorListener();
      NotificationFilterSupport filter = new NotificationFilterSupport();
      filter.enableType("jmx.monitor.counter");
      filter.enableType("jmx.monitor.error");
      // MBean サーバの addNotificationListener メソッドを使用して、
      // モニタ MBean にリスナとフィルタを登録する
      System.out.println("===> ADD NOTIFICATION LISTENER TO "+monitorON);
      connection.addNotificationListener(monitorON, listener, filter, null);
      System.out.println("\n[myListener]: Listener registered ...");
      // モニタを起動する
      connection.invoke(monitorON, "start", new Object[] { }, new String[] { });
      // リモート クライアントをアクティブに保つ
      System.out.println("pausing...........");
      System.in.read();
   } catch(Exception e) {
      System.out.println("Exception: " + e);
      e.printStackTrace();
   }
}

  ページの先頭       前  次