ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発
11g リリース 1 (10.3.1)
B55537-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

7 通知とモニタ MBean の使い方

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

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

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

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

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

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

通知の要件が複雑な場合や、MBean 属性値の 1 つの変更に直接関連付けられない一連の変更をモニタする場合は、モニタ MBean を使用します。(http://java.sun.com/javase/6/docs/api/javax/management/monitor/package-summary.html で J2SE 6.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 などの追加の通知オブジェクト型を定義しています。追加のオブジェクト型には、さまざまなタイプのイベントに適した特殊な情報が含まれています。((http://java.sun.com/javase/6/docs/api/javax/management/Notification.html) で J2SE 6.0 API 仕様の javax.management.NotificationNotification サブクラスのリストを参照してください。)また、『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 を参照。(http://java.sun.com/javase/6/docs/api/javax/management/MBeanServerConnection.html#queryNames(javax.management.ObjectName,%20javax.management.QueryExp) を参照。

WebLogic Server リソースが作成される、破棄される

サーバや JDBC データ ソースなどのリソースを作成するときに、WebLogic Server はリソースのコンフィグレーション MBean を MBean サーバに登録する。リソースを削除するときに、コンフィグレーション MBean の登録を解除する。

Mbean の登録と登録解除をリスンするには、javax.management.MBeanServerDelegate にリスナを登録する。MBean が登録または登録解除されると javax.management.MBeanServerNotification

型の通知を送信する。

編集 MBean サーバ内の MBeanServerDelegate にリスナを登録した場合は、保留中の MBean 階層が変更されたときに通知を受信する。

実行時 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 リソースが生成するエラー メッセージのリストについては、『Oracle Fusion Middleware Oracle 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 にリスナのパッケージ化およびデプロイ化」を参照してください。

通知リスナの作成

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

  1. javax.management.NotificationListener を実装するクラスを作成します。

    http://java.sun.com/javase/6/docs/api/javax/management/NotificationListener.htmlJ2SE 6.0 API 仕様NotificationListener を参照してください。

  2. クラス内に NotificationListener.handleNotification(Notification notification, java.lang.Object handback) メソッドを追加します。


    注意 :

    通知ブロードキャスタをブロックしないように、このメソッドの実装はできるだけ早く復帰する必要があります。

  3. (省略可能) ほとんどの場合、MBean が通知オブジェクトを送信したという単純な事実以上のことを知る必要があります。たとえば、通知オブジェクトの Type 属性の値を知ることができます。この値は、通知の送信を引き起こしたイベントのタイプを分類するのに使用します。

    通知オブジェクトから情報を取得するには、handleNotification メソッドの内部で、そのオブジェクトのメソッドを呼び出します。すべての通知型は javax.management.Notification を拡張しているので、Notification の以下のメソッドはすべての通知で使用できます。

    • getMessage()

    • getSequenceNumber()

    • getTimeStamp()

    • getType()

    • getUserData()

    (http://java.sun.com/javase/6/docs/api/javax/management/Notification.html) で J2SE 6.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 クラスを作成するときに、以下の推奨事項を考慮してください。

  • 通知フィルタを使用しない限り、リスナはそのリスナが登録されている MBean からの (すべての通知型の) すべての通知を受信する。

    MBean から送信されるすべての通知に 1 つのリスナを使用するのではなく、フィルタとリスナを組み合わせて使用するのが最適です。複数のリスナを使用すると JVM の初期化に時間がかかりますが、その代わりにコードの保守が容易になります。

  • WebLogic Server 環境にモニタする必要のある MBean タイプの複数のインスタンスがある場合は、1 つの通知リスナを作成して、モニタする MBean インスタンスと同じ数だけ登録クラスを作成できる。

    たとえば、WebLogic Server ドメインに 3 つの JDBC データ ソースがある場合は、AttributeChangeNotification をリスンする 1 つのリスナ クラスを作成できます。次に、3 つの登録クラスを作成します。各登録クラスは、リスナを JDBCDataSourceRuntimeMBean の特定のインスタンスに登録します。

  • handleNotification メソッド シグネチャには handback オブジェクトの引数が含まれているが、リスナでは handback オブジェクトからデータを取得したり、handback オブジェクトを操作したりする必要はない。handback オブジェクトは、リスナが MBean エミッタに関する情報を関連付けるのを助ける非透過的なオブジェクトです。

  • 通知ブロードキャスタをブロックしないように、handleNotification メソッドの実装はできるだけ早く復帰する必要がある。

  • 特殊な通知型のメソッドを呼び出す場合は、そのメソッド呼び出しを if 文でラップして、リスナがすべての型の通知オブジェクトのメソッドを呼び出さないようにする。

通知フィルタのコンフィグレーション

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

  1. リスナを MBean に登録するクラスで、javax.management.NotificationFilterSupport または AttributeChangeNotificationFilter のインスタンスを作成します。

  2. フィルタ クラスのメソッドを呼び出して、フィルタ条件を指定します。

    J2SE 6.0 API 仕様の NotificationFilterSupport (http://java.sun.com/javase/6/docs/api/javax/management/NotificationFilterSupport.html) または AttributeChangeNotificationFilter (http://java.sun.com/javase/6/docs/api/javax/management/AttributeChangeNotificationFilter.html) を参照してください。

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

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

カスタム フィルタの作成

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

通知リスナとフィルタの登録

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

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

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

    MBean サーバへのリモート接続の作成」を参照してください。

  2. WebLogic Server MBean に登録するには、MBean 階層を移動して、リスンする MBean のオブジェクト名を取得します。「MBean サーバへのリモート接続の作成」を参照してください。

    カスタム MBean に登録するには、その MBean の JMX オブジェクト名を含む ObjectName を作成します。(http://java.sun.com/javase/6/docs/api/javax/management/ObjectName.html) で J2SE 6.0 API 仕様の javax.management.ObjectName を参照してください。

  3. 作成したリスナ クラスをインスタンス化します。

  4. (省略可能) JDK のフィルタ クラスのいずれかをインスタンス化してコンフィグレーションします。または、カスタム クラスをインスタンス化します。

  5. MBean のオブジェクト名、リスナ クラス、およびフィルタ クラスを MBeanServerConnection.addNotificationListener (ObjectName name, ObjectName listener, NotificationFilter filter,Object handback) メソッドに渡して、リスナとフィルタを登録します。

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

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

サンプル クラスには、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 ディレクトリにコピーする。『Oracle Fusion Middleware Oracle WebLogic Server ドメインのコンフィグレーションについて』の「ドメイン ディレクトリの内容」を参照。

WebLogic Server 起動クラスとして

リスナ クラスをサーバのクラスパスに追加する。それには、クラスを JAR ファイルにアーカイブして、その JAR をサーバの lib ディレクトリにコピーする。

フィルタ クラスをサーバのクラスパスに追加する。それには、クラスを JAR ファイルにアーカイブして、その JAR をサーバの lib ディレクトリにコピーする。『Oracle Fusion Middleware Oracle WebLogic Server ドメインのコンフィグレーションについて』の「ドメイン ディレクトリの内容」を参照。

WebLogic Server にデプロイするアプリケーションの一部として

リスナ クラスをアプリケーションと一緒にパッケージ化する。

フィルタ クラスをアプリケーションと一緒にパッケージ化する。

また、モニタする MBean をホストしている各サーバ インスタンスのクラスパスにフィルタ クラスを追加する。それには、次のいずれかを行う。


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

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

これらのイベントをリスンするには、リスナを javax.management.MBeanServerDelegate に登録します。

MBean が登録または登録解除されるたびに、javax.management.MBeanServerNotification 型の通知を送信します。J2SE 6.0 API 仕様の (http://java.sun.com/javase/6/docs/api/javax/management/MBeanServerDelegateMBean.html)MBeanServerDelegate を参照してください。

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

  • 登録された WebLogic Server MBean のタイプに関する情報を提供するために、リスナは登録された MBean のオブジェクト名を検索する。すべての WebLogic Server MBean オブジェクト名には、名前が「Type」で、値が MBean のタイプを表す、キー プロパティが含まれています。たとえば、ServerRuntimeMBean のインスタンスには、オブジェクト名に Type=ServerRuntime キー プロパティが含まれています。

  • すべての JMX 通知には Type 属性が含まれており、その値によって通知の分類とフィルタ処理ができる。MBeanServerNotificationType 属性には、2 つの文字列「JMX.mbean.registered」または「JMX.mbean.unregistered」のうち 1 つだけ含まれています。また、JMX 通知には Type 属性の値を返す getType メソッドも含まれます。

    コード リスト 7-3 のリスナは、Type 属性の値に応じて異なるコード行を呼び出します。

  • JDBCDataSourceRuntimeMBean が登録されると、リスナはこの MBean のオブジェクト名をカスタム メソッドに渡す。カスタム メソッドはリスナを登録し、JDBCDataSourceRuntimeMBean 用のフィルタをコンフィグレーションします。この MBean リスナは、MBean の Enabled 属性が変更されるとメッセージを送信します。

    カスタム メソッドの実装クラスは (フィルタ クラスではなく) 登録クラス内にあるので、メソッドは登録クラスの MBean サーバへの接続を再利用できます。再利用によってリソースが有効に活用され、複数のクラスに資格と URL を格納する必要がなくなります。

コード リスト 7-3 例 : MBean の登録および登録解除のリスン

import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.MBeanServerNotification;
import javax.management.ObjectName;

public class DelegateListener implements NotificationListener {
   public void handleNotification(Notification notification, Object obj) {
      if (notification instanceof MBeanServerNotification) {
         MBeanServerNotification msnotification = 
         (MBeanServerNotification) notification;

         // MBeanServerNotification の Type 属性の値を取得する
         // 「JMX.mbean.registered」または「JMX.mbean.unregistered」が
         // 含まれている
         String nType = msnotification.getType();

         // 登録または登録解除された MBean のオブジェクト名を
         // 取得する
         ObjectName mbn = msnotification.getMBeanName();

         // WebLogic Server MBean のオブジェクト名には常に
         // 「Type」キー プロパティが含まれている。これは、
         // MBean のタイプ (ServerRuntime や Log など) を表す
         String key = mbn.getKeyProperty("Type");

        if (nType.equals("JMX.mbean.registered")) {
            System.out.println("A " + key + " has been created.");

            System.out.println("Full MBean name: " + mbn);
            System.out.println("Time: " + msnotification.getTimeStamp());
               if (key.equals("JDBCDataSourceRuntime")) {
               // リスナを ServerRuntimeMBean に登録する。
               // 「ListenToDelegate」クラスに
               // 「registerwithServerRuntime」メソッドを定義すると、
               // 「ListenToDelegate」が確立した接続を再利用できる。
               // リソースを有効に利用する方法となるだけでなく、必要がなくなる
               // 複数のクラスに資格と URL を格納する
               // 必要がなくなる。
               ListenToDelegate.registerwithJDBCDataSourceRuntime(mbn);
            }
         }
         if (nType.equals("JMX.mbean.unregistered")) {
            System.out.println("An MBean has been unregistered");
            System.out.println("Server name: " +
               mbn.getKeyProperty("Name"));
            System.out.println("Time: " + msnotification.getTimeStamp());
            System.out.println("Full MBean name: "
               + msnotification.getMBeanName());
         }
      }
   }
}

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

  • MBeanServerDelegate の JMX オブジェクト名は常に "JMImplementation:type=MBeanServerDelegate"

  • main メソッドでは、通知の Type 属性の値が「JMX.mbean.registered」または「JMX.mbean.unregistered」で始まる場合にのみ通知を転送するように、javax.management.NotificationFilterSupport のインスタンスをコンフィグレーションする。

  • registerwithJDBCDataSourceRuntime メソッドは、指定された JDBCDataSourceRuntimeMBean インスタンスに コード リスト 7-1 のリスナを登録する。このメソッドでは javax.management.AttributeChangeNotificationFilter もコンフィグレーションします。これは、Enabled という属性の変更について説明する AttributeChangeNotification のみを転送します。

これらのメソッドをコンパイルして実行するには、コード リスト 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 を提供しています。

  • StringMonitorMBean - 値が String の属性を観察します。

    このモニタを使用して、ServerLifeCycleRuntimeMBean State などの属性を定期的に観察します。

    (http://java.sun.com/javase/6/docs/api/javax/management/monitor/StringMonitor.html) で StringMonitorMBean を実装する J2SE 6.0 API 仕様の javax.management.monitor.StringMonitor を参照してください。

  • GaugeMonitorMBean - 値が Number の属性を観察します。

    このモニタを使用して、通常の処理の結果として値が変動する属性を観察します。属性の値が特定の範囲外まで変動した場合に通知を送信するように、ゲージ モニタをコンフィグレーションします。たとえば、ゲージ モニタを使用して ThreadPoolRuntimeMBean StandbyThreadCount 属性をモニタし、サーバの未使用かつ使用可能なスレッドの数が許容範囲内にあることを確認できます。

    J2SE 6.0 API 仕様の javax.management.monitor.GaugeMonitor を参照してください。GaugeMonitorMBean を実装する ((http://java.sun.com/javase/6/docs/api/javax/management/monitor/GaugeMonitor.html) を参照してください。)

  • CounterMonitorMBean - 値が Number の属性を観察します。

    このモニタを使用して、通常の処理の結果として値が増加する属性を観察します。属性の値が上限しきい値を超えた場合に通知を送信するように、カウンタ モニタをコンフィグレーションします。しきい値を増やして指定された時点でしきい値をリセットするように、カウンタ モニタをコンフィグレーションすることもできます。

    たとえば、サーバでのヒット総数を追跡して、100 ヒット増えるたびに通知を受けるようにするには、ServerRuntimeMBean SocketsOpenedTotalCount 属性を観察するカウンタ モニタを使用します。

    J2SE 6.0 API 仕様の javax.management.monitor.CounterMonitor を参照してください。CounterMonitorMBean を実装する (http://java.sun.com/javase/6/docs/api/javax/management/monitor/CounterMonitor.html を参照してください。)

すべてのモニタ 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 プロパティに以下のいずれかの値をエンコードします。

  • jmx.monitor.error.mbean - 観察対象 MBean が MBean サーバに登録されていないことを示します。通知では、観察対象のオブジェクト名が示されます。

  • jmx.monitor.error.attribute - 観察対象の属性が観察対象オブジェクトに存在しないことを示します。通知では、観察対象のオブジェクト名と属性名が示されます。

  • jmx.monitor.error.type - 観察対象の属性値のオブジェクト インスタンスが null か、またはモニタに対応していない型であることを示します。通知では、観察対象のオブジェクト名と属性名が示されます。

  • jmx.monitor.error.runtime - 観察対象の属性値の取得中に (上記以外の理由で) 送出された例外が含まれます。

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

  • カウンタ モニタの場合、しきい値、オフセット、または係数の型が観察対象のカウンタ属性と同じでない場合

  • ゲージ モニタの場合、下限しきい値または上限しきい値が観察対象のゲージ属性と同じでない場合

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

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

  • MonitorNotification 型の通知をリスンする。

  • 必要に応じて、javax.management.monitor.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 サーバへの接続を初期化します。

    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=SocketMonitor,Type=CounterMonitor

  3. いずれかのモニタ MBean を作成して登録します。

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

    • classname は、次のいずれかの値。

      • javax.management.monitor.CounterMonitor

      • javax.management.monitor.GaugeMonitor

      • javax.management.monitor.StringMonitor

    • name は、モニタ MBean インスタンス用に作成したオブジェクト名。

  4. 属性値を設定して、モニタ MBean をコンフィグレーションします。

    設定する属性のガイドラインについては、http://java.sun.com/javase/6/docs/api/javax/management/monitor/package-summary.html で J2SE 6.0 API 仕様の javax.management.monitoring パッケージを参照してください。

  5. モニタ MBean がモニタする MBean (観察対象 MBean) を指定するには、モニタ MBean の addObservedObject(ObjectName objectname) および addObservedAttribute(String attributename) オペレーションを呼び出します。

    • objectname は観察対象 MBean の ObjectName

    • attributename はモニタする観察対象 MBean の属性名

    モニタ MBean の 1 つのインスタンスで複数の MBean をモニタできます。モニタする MBean インスタンスごとに addObservedObject および addObservedAttribute オペレーションを呼び出します。

  6. モニタ MBean 用の通知リスナの作成」で作成したリスナ オブジェクトをインスタンス化します。

  7. 必要に応じて、フィルタをインスタンス化してコンフィグレーションします。

  8. リスナとフィルタ (省略可能) をモニタ MBean に登録します。リスナを観察対象 MBean には登録しないでください。

    モニタ MBean のaddNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) メソッドを呼び出します。

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

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

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

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

  • CounterMonitorMBean の 1 つのインスタンスで ServerRuntimeMBean のすべてのインスタンスをモニタする。ドメイン実行時 MBean サーバは、別の JVM で動作する ServerRuntimeMBean インスタンスへの結合アクセスを CounterMonitorMBean に与えています。

  • リスナ クラスのとフィルタ クラスの 1 つのインスタンスが、CounterMonitorMBean からの通知をリスンしてフィルタ処理する。

この 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();
   }
}