ナビゲーションをスキップ

WebLogic JMX Service プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

WebLogic Server MBean の通知とモニタの使い方

コンフィグレーション情報と実行時情報の変更をレポートするために、すべての WebLogic Server MBean は JMX 通知を送信します。通知は、基になるリソースで発生した状態の変更または他の特定の状態を説明する JMX オブジェクトです。

これらの通知をリスンするには、リスナという Java クラスを作成できます。たとえば、アプリケーションのデプロイ、アンデプロイ、再デプロイ時に通知を受信するリスナをアプリケーションに組み込むことができます。

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

 


通知のブロードキャストと受信

すべての WebLogic Server MBean は、javax.management.NotificationBroadcaster インタフェースを実装します。このインタフェースにより、発生したイベントのタイプに応じてさまざまなタイプの通知オブジェクトを送信できます。たとえば、MBean はその属性の値が変更されたときに通知を送信します。

そのような通知をリスンするには、javax.management.NotificationListener を実装するリスナ クラスを作成します。

デフォルトでは、リスナは MBean から送信されるすべての通知を受信します。ただし、たいていの場合は特定の通知のみを受信する方が適切です。たとえば、LogBroadCasterRuntime MBean は WebLogic Server インスタンスからログ メッセージが生成されるたびに通知を送信します。通常は、特定の重大度のメッセージなどの特定のログ メッセージのみリスンします。通知フィルタを作成すると、リスナが受信する通知を制限できます。

リスナとフィルタ (任意) を作成したら、そのクラスを通知を受信する MBean に登録します。

図 6-1 に、NotificationListener が MBean からブロードキャストされる通知の一部のみを受信する基本的なシステムを示します。

図 6-1 MBean からの通知の受信

MBean からの通知の受信


 

JMX 通知とその機能の詳細を参照するには、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html から JMX 1.0 仕様をダウンロードします。

 


Mbean の変更のモニタ

WebLogic Server には、モニタ MBean があります。モニタ MBean は、MBean を定期的に観察し、特定の MBean 属性が特定のしきい値を超えて変更された場合にのみ JMX 通知を送信するようにコンフィグレーションできます。モニタ MBean では、MBean の属性の値そのもの、または数値属性の 2 つの連続する値の差異 (オプション) を観察できます。モニタ MBean が観察する値は、派生ゲージと呼びます。

派生ゲージが一連の条件を満たす場合、モニタ MBean は特定の通知タイプを送信します。また、属性値のモニタ中に一定のエラー状態が発生した場合にも通知を送信できます。

モニタ MBean を使用するには、モニタをコンフィグレーションして WebLogic Server MBean に登録します。次に、リスナ クラスを作成して、そのクラスをモニタ MBean に登録します。モニタ MBean は非常に特殊な種類の通知のみを送信するので、通常、モニタ MBean からの通知をリスンする際にはフィルタは使用しません。

図 6-2 は、モニタ MBean が WebLogic Server MBean に登録される基本的なシステムを示しています。NotificationListener がモニタ MBean に登録され、モニタ MBean 内の条件が満たされた場合に通知を受信します。

図 6-2 モニタ MBean

モニタ MBean


 

 


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

WebLogic Server では、MBean 内の変更について 2 通りの方法で通知を受けることができます。リスナを作成してそれを直接 MBean に登録するか (図 6-1 を参照)、または MBean を定期的に観察して属性値が指定の基準を満たしたときに通知を送信するモニタ MBean をコンフィグレーションすることができます (図 6-2 を参照)。どの方法を選ぶかは、主に通知を受信する状況の複雑さによって決まります。

要件が単純な場合は、リスナを MBean に直接登録する方が適切です。NotificationListener インタフェースおよび NotificationFilter インタフェース (リスナおよびフィルタで実装するクラス) には、値をしきい値などと比較するための機能がほとんどありません。通知のデータを評価し、その結果に応じて応答する独自のコードを作成する必要があります。ただし、リスナを直接 MBean に登録すると、MBean から通知がリスナに送信され、変更が直ちに通知されるというメリットがあります。

通知要件が複雑な場合、たとえば MBean 属性の値の単一の変更とは直接関係のない一連の変更をモニタする場合などには、モニタ MBean を使用します。モニタ MBean は、データを比較して、非常に特殊な状況でのみ通知を送信するためのツールを提供します。ただし、モニタは観察対象 MBean で属性値の変更を定期的にポーリングし、変更の通知は指定したポーリング期間でしか受けられません。

 


ベスト プラクティス : 一般的にモニタされる属性

表 6-1 の属性は、WebLogic Server のパフォーマンスの概要を提供します。リスナを作成して属性が含まれる MBean に直接登録するか、モニタ MBean をコンフィグレーションすることで、これらの属性をモニタできます。

リスナを作成して登録するか、モニタ MBean をコンフィグレーションするには、モニタする属性が含まれる MBean の WebLogicObjectName を指定する必要があります。「通知リスナとフィルタの登録」および「モニタとリスナのインスタンス化」を参照してください。

表 6-1 の情報を使用して、各 MBean の WebLogicObjectName を作成します。表では、domain は WebLogic Server ドメインの名前を表し、server はモニタする MBean をホストする WebLogic Server インスタンスの名前を表します。

表 6-1 一般的にモニタされる WebLogic Server の属性

MBean および属性名

説明

MBean のタイプ : ServerRuntime

属性名 : State

MBean の WebLogicObjectName :
domain:Location=server,Name=server,
Type=ServerRuntime

例 :
medrec:Location=MedRecServer,Name=MedRe
cServer,Type=ServerRuntime

サーバの状態が InitializingSuspendedRunning、または ShuttingDown のどれであるかを示す。

MBean のタイプ : ServerRuntime

属性名 : OpenSocketsCurrentCount

MBean の WebLogicObjectName :
上の行を参照。

この 2 つの属性を一緒に使用して、サーバのリスン ポートにおける現在のアクティビティと、ポート上でバックログできるリクエストの総数を比較する。

属性が 2 つの別々の MBean にあることに注意。

  • OpenSocketsCurrentCountServerRuntime MBean にある。

  • AcceptBacklogServer コンフィグレーション MBean にある。

MBean のタイプ : Server

属性名 : AcceptBacklog

WebLogicObjectName for the MBean:
domain:Name=server,Type=Server

例 :
medrec:Name=MedRecServer,Type=Server

MBean 型 : ExecuteQueueRuntime

属性名 : ExecuteThreadCurrentIdleCount

MBean の WebLogicObjectName :
domain:Location=server,
Name=weblogic.kernel.Default,
ServerRuntime=
server,
Type=ExecuteQueueRuntime

例 :
medrec:Location=MedRecServer,Name=
weblogic.kernel.Default,
ServerRuntime=MedRecServer,
Type=ExecuteQueueRuntime

メモリ領域を占有しているがデータの処理には使用されていない、サーバのデフォルト実行キューのスレッド数を表示する。

サーバ インスタンスに実行キューを複数作成して、重要度の高いアプリケーションのパフォーマンスを最適化できる。ただし、デフォルトでは、default 実行キューが使用される。詳細については、「実行キューによるスレッド使用の制御」を参照。

MBean 型 : ExecuteQueueRuntime

属性名 : PendingRequestCurrentCount

MBean の WebLogicObjectName :
上の行を参照。

サーバのデフォルト実行キューで待機するリクエスト数を表示する。

MBean のタイプ : JVMRuntime

属性名 : HeapSizeCurrent

MBean の WebLogicObjectName :
domain:Location=server,Name=server,
ServerRuntime=
server,Type=JVMRuntime

例 :
medrec:Location=MedRecServer,Name=
MedRecServer,ServerRuntime=MedRecServer
,Type=JVMRuntime

サーバの JVM ヒープで現在使用できるメモリの容量 (バイト単位) を表示する。

詳細については、「Java 仮想マシン (JVM) のチューニング」を参照。

MBean のタイプ : JDBCConnectionPoolRuntime

属性名 : ActiveConnectionsCurrentCount

WebLogicObjectName for the MBean:
domain:Location=server,Name=poolName,
ServerRuntime=
server,
Type=JDBCConnectionPoolRuntime

poolName は、作成時に接続プールに指定した名前。

For example:
medrec:Location=MedRecServer,Name=
MedRecPool-PointBase,ServerRuntime=
MedRecServer,Type=JDBCConnectionPoolRun
time

JDBC 接続プールの現在アクティブな接続の数を表示する。

詳細については、「JDBC 接続プールによるパフォーマンスの向上」を参照。

MBean のタイプ : JDBCConnectionPoolRuntime

属性名 : ActiveConnectionsHighCount

MBean の WebLogicObjectName :
上の行を参照。

JDBC 接続プールのアクティブな接続の最大数。この数は、接続プールがインスタンス化されるたびにゼロから開始する。

MBean のタイプ : JDBCConnectionPoolRuntime

属性名 : LeakedConnectionCount

リークされた接続の総数があらかじめ指定されたしきい値に達すると、リスナに通知する。リークされた接続とは、チェックアウト済みだが close() 呼び出しによって接続プールに返されないもの。リークされた接続はその後の接続要求に対応できないため、その総数をモニタしておくことが重要である。

MBean のタイプ : JDBCConnectionPoolRuntime

属性名 : ActiveConnectionsCurrentCount


指定された JDBC 接続プールに対する、現在のアクティブな接続数があらかじめ指定されたしきい値に達すると、リスナに通知する。

MBean のタイプ : JDBCConnectionPoolRuntime

属性名 : ConnectionDelayTime

接続プールに接続する平均時間があらかじめ指定されたしきい値を超えると、リスナに通知する。

MBean のタイプ : JDBCConnectionPoolRuntime

属性名 : FailuresToReconnect

接続プールがそのデータストアへの再接続に失敗すると、リスナに通知する。アプリケーションでは、この属性がインクリメントしたり、しきい値に達したりすると、許容できる中断時間のレベルに応じてリスナに通知できる。


 

 


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

WebLogic Server MBean から直接送信される通知をリスンするには、次の手順に従います。

  1. リスンする通知の種類を決めます。「WebLogic Server 通知タイプ」を参照してください。
  2. アプリケーションにリスナ クラスを作成します。「通知リスナの作成」を参照してください。
  3. 必要に応じてフィルタ クラスを作成します。フィルタ クラスは、リスナが MBean から受信する通知の種類を指定します。「通知フィルタの作成」を参照してください。
  4. 通知を受信する MBean にリスナおよびフィルタを登録するクラスを作成します。「通知リスナとフィルタの登録」を参照してください。

WebLogic Server 通知タイプ

すべての WebLogic Server MBean は、javax.management.NotificationBroadcaster インタフェースを実装します。このインタフェースにより、発生したイベントのタイプに応じてさまざまなタイプの通知オブジェクトを送信できます。

javax.management 通知タイプの詳細については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

weblogic.management 通知タイプの詳細については、「AttributeAddNotification」および「AttributeRemoveNotification」の Javadoc を参照してください。

通知リスナの作成

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

  1. 次のいずれかのインタフェースを実装するクラスを作成します。
  2. 作成したクラスで、次のいずれかを追加します。
  3. リスナが受信した通知オブジェクトからデータを取得するには、handleNotification メソッドの中で、通知オブジェクトの javax.management.Notification メソッドを呼び出します。
  4. たとえば、通知と関連付けられたタイム スタンプを取得するには、notification.getTimeStamp() を呼び出します。

    通知タイプはすべて javax.management.Notification の拡張なので、すべての通知で次の Notification メソッドを利用できます。

    Notification メソッドの詳細については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントで、javax.management.Notification の Javadoc を参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

  5. ほとんどの通知タイプは、その通知に固有のデータを取得するための追加メソッドを提供します。たとえば、WebLogicLogNotification は WebLogic Server ログ メッセージの特定の属性を取得するための、getSeverity() などのメソッドを提供します。getSeverity() は、ログ メッセージが指定する重大度を取得します。
  6. 通知タイプに固有のデータを取得する必要があるが、標準の javax.management.Notification メソッドでは取得できない場合は、次のようにします。

    1. 通知にフィルタをかけて、特定のタイプの通知のみを選択するロジックを handleNotification メソッドに追加します。
    2. 通知オブジェクトからデータを抽出するために通知タイプで提供されるメソッドを呼び出します。
    3. 次に例を示します。

      if(notification instanceof MonitorNotification) {
        MonitorNotification monitorNotification = (MonitorNotification)                                                      notification;
        System.out.println("This notification is a MonitorNotification");
        System.out.println("Observed Attribute: " +
                             monitorNotification.getObservedAttribute() );
      }

NotificationListener クラスの作成時には、上記の手順だけでなく以下の事項も考慮してください。

次の例では、リモート リスナを作成します。AttributeChangeNotification オブジェクトを受信すると、リスナは AttributeChangeNotification のメソッドを使用して値の変更された属性の名前と古い値および新しい値を取得します。

コード リスト 6-1通知リスナ

import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import weblogic.management.RemoteNotificationListener;
import javax.management.AttributeChangeNotification;
public class MyListener implements RemoteNotificationListener {
    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() );
        }
    }
}

通知フィルタの作成

フィルタを作成して登録するには、次の手順に従います。

  1. javax.management.NotificationFilter を実装するシリアライズ可能クラスを作成します。
  2. 必要に応じて、javax.management.NotificationFilterSupport クラスをインポートします。このクラスは、通知をフィルタ処理するためのユーティリティ メソッドを提供します。これらのメソッドの使用方法については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

    フィルタは、リモート通知リスナで使用される場合のみシリアライズ可能である必要があります。RMI と共に使用されるクラスは、リモート JVM で分解および再構築できるようにシリアライズ可能である必要があります。

  3. isNotificationEnabled(Notification notification) メソッドを使用して、条件が満たされた場合にシリアライズ可能オブジェクトから true 値が返されるかどうかを示します。
  4. true が返される場合、フィルタはそれが登録されているリスナに通知を転送します。

  5. (省略可能) 通知からデータを取得し、通知のデータに基づいてアクションを実行するコードを含めることもできます。たとえば、フィルタで javax.management.AttributeChangeNotification のメソッドを使用して特定の属性の新しい値を表示できます。値が指定のしきい値を超えている場合は、JavaMail API を使用して管理者に電子メールを送信できます。

コード リスト 6-2 に、AttributeChangeNotification タイプの通知のみを転送するサンプル NotificationFilter を示します。

コード リスト 6-2通知フィルタの例

import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.AttributeChangeNotification;
public class MyHiCountFilter implements NotificationFilter,
                 java.io.Serializable {
    public boolean isNotificationEnabled(Notification notification) {
        if (!(notification instanceof AttributeChangeNotification)) {
            return false;
        }
        AttributeChangeNotification acn =
                   (AttributeChangeNotification)notification;
        acn.getAttributeName().equals("ActiveConnectionsHighCount"); {
            return true;
        }
    }
}

フィルタ クラスのサーバのクラスパスへの追加

リモート JVM で動作するリスナのフィルタを作成する場合は、通知をリスンしているサーバ インスタンスのクラスパスにフィルタのクラスを追加できます。リスナはリモート JVM で動作していますが、サーバのクラスパスにフィルタのクラスを追加すると、フィルタとリスナの間で転送されるシリアライズされたデータの量が最小限に抑えられます(図 6-3 を参照)。

図 6-3 WebLogic Server で動作するフィルタ

WebLogic Server で動作するフィルタ


 

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

通知リスナ クラスとフィルタ (オプション) を実装した後は、リスナとフィルタを MBean インスタンスに登録するクラスを作成します。モニタする MBean インスタンスごとに、登録クラスを 1 つ作成する必要があります。

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

  1. MBeanHome インタフェースを取得し、MBeanHome を使用して MBeanServer インタフェースを取得するクラスを作成します。
  2. リスナとフィルタを管理 MBean に登録する場合は、管理サーバ上のみにある管理 MBeanHome を取得する必要があります。ローカル コンフィグレーション MBean または実行時 MBean に登録する場合は、その MBean をホストするサーバ インスタンスのローカル MBeanHome を取得する必要があります。

  3. 作成したリスナ クラスおよびフィルタ クラスをインスタンス化します。
  4. 登録する MBean の WebLogicObjectName を作成します。
  5. 一般的にモニタされる MBean とその WebLogicObjectName のリストについては、表 6-1 を参照してください。

  6. WebLogicObjectName、リスナ クラス、およびフィルタ クラスを MBeanServer インタフェースの addNotificationListener() メソッドに渡してリスナとフィルタを登録します。
  7. 図 6-1 ではリスナとフィルタを直接 MBean に登録していますが (MBean の addNotificationListener() メソッドを呼び出して登録)、実際には、MBeanServer インタフェースの addNotificationListener() メソッドを使用する方がより適切です。そうすることで、登録作業だけのために特定の MBean をルックアップする手間を省けます。

次の例は、リモート JVM で動作する登録クラスです。クラスが WebLogic Server インスタンスと同じ JVM で動作する場合、MBeanHome インタフェースを取得するためのコードはさらに単純なものになります。詳細については、「MBeanHome インタフェースへのアクセス」を参照してください。

このクラス例は、コード リスト 6-1 のリスナと コード リスト 6-2 のフィルタを Server1 というサーバ インスタンスの Server 管理 MBean に登録します。この例で、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。MBean の表示や変更のパーミッションの詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ロール」を参照してください。

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

コード リスト 6-3 管理 MBean のリスナの登録

import java.util.Set;
import java.util.Iterator;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.management.ObjectName;
import javax.management.Notification;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import weblogic.management.WebLogicMBean;
import weblogic.management.WebLogicObjectName;
import weblogic.management.RemoteMBeanServer;
import weblogic.management.configuration.ServerMBean;
public class listener {
    public static void main(String[] args) {
        MBeanHome home = null;
        RemoteMBeanServer rmbs = null;
        //ドメイン変数
        String url = "t3://localhost:7001";
        String serverName = "Server1";
        String username = "weblogic";
        String password = "weblogic";
        //MBeanHome を使用して MBeanServer を取得
        try {
            Environment env = new Environment();
            env.setProviderUrl(url);
            env.setSecurityPrincipal(username);
            env.setSecurityCredentials(password);
            Context ctx = env.getInitialContext();
            //管理 MBeanHome インタフェースを取得
            home = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
            System.out.println("Got the Admin MBeanHome: " + home );
            rmbs = home.getMBeanServer();
        } catch (Exception e) {
            System.out.println("Caught exception: " + e);
        }
        try {
            //リスナ クラスをインスタンス化
            MyListener listener = new MyListener();
            MyFilter filter = new MyFilter();
            //リスンする必要のある MBean の WebLogicObjectName
            //を作成
            WebLogicObjectName mbeanName = new WebLogicObjectName(serverName,
                             "Server",home.getDomainName());
            System.out.println("Created WebLogicObjectName: " + mbeanName);
            //MBean の名前とリスナ クラスを MBeanServer の
            //addNotificationListener メソッドに渡す
            rmbs.addNotificationListener(mbeanName, listener, filter, null);
            System.out.println("\n[myListener]: Listener registered ...");
            //リモート クライアントをアクティブに保つ
            System.out.println("pausing...........");
            System.in.read();
        } catch(Exception e) {
            System.out.println("Exception: " + e);
        }
    }
}

コンフィグレーション監査メッセージのリスン : 主な手順

ユーザがコンフィグレーションを変更したり、ドメイン内のリソースに対する管理操作を呼び出したりする場合に、管理サーバがログ メッセージを送信するようにコンフィグレーションすることができます。たとえば、ユーザがドメインの管理対象サーバの SSL を無効化すると、管理サーバがログ メッセージを送信します。これらのメッセージは、ドメインのコンフィグレーション内における変更の監査記録を提供します (コンフィグレーション監査)。Administration Console オンライン ヘルプの「コンフィグレーション監査」を参照してください。

コンフィグレーション監査メッセージに対応する JMX のリスナおよびフィルタを作成するには、次の手順に従います。

  1. WebLogic Server ログ メッセージから情報を抽出する通知リスナを作成してコンパイルします。
  2. コンフィグレーション監査メッセージの通知リスナ」を参照してください。

  3. コンフィグレーション監査メッセージのみを選択する通知フィルタを作成してコンパイルします。
  4. コンフィグレーション監査メッセージの通知フィルタ」を参照してください。

  5. これらのリスナとフィルタを管理サーバの LogBroadcasterRuntime MBean に登録するクラスを作成してコンパイルします。これが、WebLogic Server インスタンスがログ メッセージを JMX 通知としてブロードキャストするのに使用する MBean です。
  6. コンフィグレーション監査メッセージの登録クラス」を参照してください。

  7. 通知フィルタを管理サーバのクラスパスに追加します。
  8. 通知リスナが管理サーバの JVM 内で実行される (たとえば、起動クラスとして実行される) 場合も、通知リスナおよび登録クラスを管理サーバのクラスパスに追加します。

  9. 登録クラスを呼び出すか、管理サーバの起動クラスとしてコンフィグレーションします。
  10. Administration Console オンライン ヘルプの「起動クラスと停止クラス」を参照してください。

コンフィグレーション監査メッセージの通知リスナ

コード リスト 6-1 の通知リスナ同様、コード リスト 6-4 のリスナは RemoteNotificationListener およびその handleNotification メソッドを実装します。

コンフィグレーション監査メッセージはすべて、WebLogicLogNotification タイプなので、コード リスト 6-4 のリスナは WebLogicLogNotification インタフェースをインポートし、そのメソッドを使用して各コンフィグレーション監査メッセージ内の情報を取得します。

コード リスト 6-4コンフィグレーション監査メッセージの通知リスナ

import javax.management.Notification;
import javax.management.NotificationListener;
import weblogic.management.RemoteNotificationListener;
import weblogic.management.logging.WebLogicLogNotification;
public class ConfigAuditListener implements RemoteNotificationListener {
public void handleNotification(Notification notification, Object obj) {
WebLogicLogNotification changeNotification =
(WebLogicLogNotification) notification;
System.out.println("A user has attempted to change the configuration
of a WebLogic Server domain.");
System.out.println("Admin Server Name: " +
changeNotification.getServername() );
System.out.println("Time of attempted change:" +
changeNotification.getTimeStamp() );
System.out.println("Message details:" +
changeNotification.getMessage() );
System.out.println("Message ID string:" +
changeNotification.getMessageId() );
}
}

コンフィグレーション監査メッセージの通知フィルタ

通知フィルタがないと、コード リスト 6-4 のリスナは、管理サーバがブロードキャストするすべてのメッセージについて、サーバ名、タイムスタンプ、およびメッセージ テキストを出力します。

リソースが変更されたことを示すコンフィグレーション監査メッセージのみを転送するために、コード リスト  6-5 のフィルタでは WebLogicLogNotification.getMessageId メソッドを使用してすべての受信ログ通知のメッセージ ID を取得します。

リソース変更を示すコンフィグレーション監査メッセージは、メッセージ ID 159904 によって識別されます (Administration Console オンライン ヘルプの「コンフィグレーション監査」を参照)。受信ログ通知のメッセージ ID 値がコンフィグレーション監査メッセージの ID と一致すると、フィルタで true と評価され、そのメッセージが登録リスナに転送されます。

コード リスト 6-5コンフィグレーション監査メッセージの通知フィルタ

import javax.management.Notification;
import javax.management.NotificationFilter;
import weblogic.management.logging.WebLogicLogNotification;
public class ConfigAuditFilter implements NotificationFilter ,
java.io.Serializable{
int configChangedId = 159904;
    public boolean isNotificationEnabled(Notification notification) {
if (!(notification instanceof WebLogicLogNotification)) {
return false;
        }
        WebLogicLogNotification wln =
(WebLogicLogNotification)notification;
int messageId = wln.getMessageId();
if (configChangedId == messageId) {
return true;
        } else {
return false;
}
}
}

コンフィグレーション監査メッセージの登録クラス

コード リスト 6-6 のクラスは、通知リスナおよびフィルタを管理サーバの LogBroadcasterRuntime MBean に登録します。この MBean は WebLogic Server の各インスタンスのシングルトンであり、その名前は常に TheLogBroadcaster です。

コード リスト 6-6コンフィグレーション監査メッセージの登録クラス

import java.util.Set;
import java.util.Iterator;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.management.ObjectName;
import javax.management.Notification;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import weblogic.management.WebLogicMBean;
import weblogic.management.WebLogicObjectName;
import weblogic.management.RemoteMBeanServer;
import weblogic.management.configuration.ServerMBean;
public class ListenRegistration {
public static void main(String[] args) {
MBeanHome home = null;
RemoteMBeanServer rmbs = null;
        //ドメイン変数
        String url = "t3://localhost:7001";
String serverName = "examplesServer";
String username = "weblogic";
String password = "weblogic";
        //Using MBeanHome to get MBeanServer.
try {
Environment env = new Environment();
env.setProviderUrl(url);
env.setSecurityPrincipal(username);
env.setSecurityCredentials(password);
Context ctx = env.getInitialContext();
            //管理 MBeanHome を取得
            home = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
System.out.println("Got the Admin MBeanHome: " + home );
rmbs = home.getMBeanServer();
        } catch (Exception e) {
System.out.println("Caught exception: " + e);
}
        try {
//リスナ クラスをインスタンス化
ConfigAuditListener listener = new ConfigAuditListener();
ConfigAuditFilter filter = new ConfigAuditFilter();
            //リスンする必要のある MBean の WebLogicObjectName
//を作成
            WebLogicObjectName mbeanName = new WebLogicObjectName(
"TheLogBroadcaster",
"LogBroadcasterRuntime",
home.getDomainName(),
serverName );
System.out.println("Created WebLogicObjectName: " + mbeanName);
            //MBean の名前とリスナ クラスを MBeanServer の
            //addNotificationListener メソッドに渡す
            rmbs.addNotificationListener(mbeanName, listener, filter, null);
System.out.println("\n[myListener]: Listener registered ...");
            //リモート クライアントをアクティブに保つ
System.out.println("pausing...........");
System.in.read();
} catch(Exception e) {
System.out.println("Exception: " + e);
        }
}
}

 


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

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

  1. 観察するデータの型に対応するモニタ MBean タイプを選択します。「モニタ MBean タイプの選択」を参照してください。
  2. モニタ MBean からの通知をリスンできるリスナ クラスを作成します。「モニタ MBean 用の通知リスナの作成」を参照してください。
  3. モニタ MBean をコンフィグレーションし、リスナ クラスをモニタ MBean に登録して、モニタ MBean を観察対象 MBean に登録するクラスを作成します。「モニタとリスナのインスタンス化」を参照してください。

モニタ MBean タイプの選択

WebLogic Server は、特定のデータ型の変更を観察するモニタ MBean を提供します。MBean が返す属性値のオブジェクト タイプと一致するモニタ MBean タイプをコンフィグレーションおよびインスタンス化する必要があります。たとえば、StringMonitor タイプに基づくモニタ MBean は、実際の属性値が (instanceof 演算子で定義されているように) String インスタンスである場合に限って、Object として宣言されている属性を観察できます。

モニタ タイプを選択するには、次の手順に従います。

  1. 以下のいずれかを行って、観察する MBean 属性によって返されるオブジェクトの型を調べます。
  2. 次の表から、モニタ タイプを選択します。
  3. 表 6-2 モニタ MBean と観察対象のオブジェクト タイプ

    モニタ MBean のタイプ

    観察するオブジェクト タイプ

    CounterMonitor

    Integer

    GaugeMonitor

    整数または浮動小数点 (ByteIntegerShortLongFloatDouble)

    StringMonitor

    String


     

モニタ タイプの詳細については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 仕様を参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

モニタの通知タイプ

各タイプのモニタ MBean は、特定のタイプの javax.management.monitor.MonitorNotification 通知を送信します。特定の通知に対しては、MonitorNotification.getType() メソッドを使用してそのタイプを判別できます。

次の表では、モニタ MBean が送信する通知のタイプについて説明します。

表 6-3 モニタ MBean と MonitorNotification タイプ

モニタ MBean のタイプ

送信する MonitorNotification タイプ

CounterMonitor

カウンタ モニタは、カウンタの値がしきい値 (比較レベル) に達したか、それを超えた場合に jmx.monitor.counter.threshold を送信する。

GaugeMonitor

  • 観察対象の属性値が増加し、高しきい値と等しくなるかそれを超えた場合、モニタから jmx.monitor.gauge.high 通知タイプが送信される。この属性値が低しきい値と等しくなるかそれを下回った場合を除き、以後高しきい値に達しても通知は行われない。

  • 観察対象の属性値が減少し、低しきい値と等しくなるかそれを下回った場合、モニタから jmx.monitor.gauge.low 通知タイプが送信される。この属性値が高しきい値と等しくなるかそれを超えた場合を除き、以後低しきい値に達しても通知は行われない。

StringMonitor

  • 観察対象の属性値が比較文字列値と一致した場合、モニタから jmx.monitor.string.matches 通知タイプが送信される。この属性値が比較文字列値と異なる場合を除き、以後この文字列が比較文字列と一致しても通知は行われない。

  • この属性値が比較文字列値と異なる場合、モニタから jmx.monitor.string.differs 通知タイプが送信される。この属性値が比較文字列値と一致する場合を除き、以後この文字列が比較文字列と異なっても通知は行われない。


 

エラー通知タイプ

すべてのモニタは、エラー状態を示す以下の通知タイプを送信できます。

また、カウンタとゲージ モニタも、以下の状態のときに jmx.monitor.error.threshold 通知タイプを送信できます。

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

モニタ MBean は、他の MBean と同じように javax.management.NotificationBroadcaster を実装して通知を送信します。モニタ MBean からの通知のリスナを作成するには、次のようなクラスを作成します。

  1. NotificationBroadcaster または weblogic.management.RemoteNotificationListener を実装している。
  2. NotificationListener.handleNotification() または RemoteNotificationListener.handleNotification() メソッドが組み込まれている。

同じ通知リスナを LogBroadcasterMBean のインスタンス、モニタ MBean、または他の MBean に登録できます。

次の例では、WebLogic Server JVM の外部の JVM で実行されるアプリケーション用のリスナ オブジェクトを作成します。この例には、モニタ MBean から通知を受信したときに追加のメッセージを出力するロジックが含まれています。このロジックはさらに改良して、「モニタの通知タイプ」で説明されている異なるタイプのモニタ通知に対してリスナが異なる方法で応答するようにすることもできます。

コード リスト 6-7 モニタ通知のリスナ

import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
import weblogic.management.RemoteNotificationListener;
public class CounterListener implements RemoteNotificationListener {
   public void handleNotification(Notification notification ,Object obj) {
      System.out.println("\n\n Notification Received ...");
      System.out.println("Type=" + notification.getType() );
      System.out.println("Message=" + notification.getMessage() );
      System.out.println("SequenceNumber=" +
         notification.getSequenceNumber());
      System.out.println("Source=" + notification.getSource());
      System.out.println("Timestamp=" + notification.getTimeStamp() + "\n" );
      if(notification instanceof MonitorNotification) {
         MonitorNotification monitorNotification =
            MonitorNotification)notification;
         System.out.println("This notification is a MonitorNotification");
         System.out.println("Observed Attribute: " +
            monitorNotification.getObservedAttribute() );
         System.out.println("Observed Object: " +
            monitorNotification.getObservedObject() );
         System.out.println("Trigger value: " +
            monitorNotification.getTrigger() );
      }
   }
}

モニタとリスナのインスタンス化

モニタ MBean を観察対象 MBean に登録するための手順は、単一のサーバ インスタンスにあるモニタ MBean、またはドメイン内の複数のサーバ インスタンスにあるモニタ MBean のどちらを登録するかによって異なります。

注意 : WebLogic Server には、モニタ MBean に対する型保証スタブが用意されていないため、標準の JMX 設計パターンを使用する必要があります。標準の JMX 設計パターンでは、JMX クライアントで MBeanServer インタフェースを使用して、モニタ MBean の属性の取得と設定、およびオペレーションの呼び出しを行います。

以降の節では、両方のタスクの例を示します。

例 : 単一サーバ上の MBean のモニタ

次の例では、ExecuteQueueRuntimeMBeanServicedRequestTotalCount 属性用のカウンタ モニタを作成します。この属性は、対応する実行キューによって処理された要求の数を返します。WebLogic Server は実行キューを使用して、重要なアプリケーションのパフォーマンスを最適化します。詳細については、「実行キューによるスレッド使用の制御」を参照してください。

単一のサーバ インスタンスにあるExecuteQueueRuntimeMBean のカウンタ モニタを作成するために、コード リスト 6-8 のサンプル クラスは次のように機能します。

  1. サーバの JNDI ツリーから javax.management.MBeanServer をルックアップします。
  2. MBeanServer インタフェースを使用した MBean へのアクセス」を参照してください。

  3. モニタ MBean インスタンスのオブジェクト名を作成します。
  4. オブジェクト名は WebLogic Server ドメイン全体に渡ってユニークで、かつ、次の JMX 命名規約に従う必要があります。

    domain name:Name=name,Type=type[,attr=value]...

    http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な javax.management.ObjectName の Javadoc を参照してください。

  5. CounterMonitorMBean のインスタンスを作成して、上記の手順で作成したオブジェクト名で登録します。
  6. MBeanServer.createMBean メソッドで、WebLogic Server JVM における MBean オブジェクトの作成と、そのサーバの MBean サーバ内へのそのオブジェクトの登録を行います。

  7. 以下の処理を行ってモニタ MBean をコンフィグレーションします。
    1. 観察対象の MBean のオブジェクト名を作成して、それを CounterMonitorMBean ObservedObject 属性の値として設定する。
    2. 一般的にモニタされる MBean とその WebLogicObjectName のリストについては、表 6-1 を参照してください。

    3. モニタ MBean の属性値を設定する。
    4. モニタのコンフィグレーションに使用する属性とオペレーションについては、以下を参照してください。

      CounterMonitor オブジェクトのコンフィグレーション

      GaugeMonitor オブジェクトのコンフィグレーション

      StringMonitor オブジェクトのコンフィグレーション

  8. モニタ MBean 用の通知リスナの作成」で作成したリスナ オブジェクトをインスタンス化します。
  9. MBean サーバの addNotificationListener() オペレーションを使用してリスナ オブジェクトを登録します。
  10. モニタの start() オペレーションを使用してモニタを起動します。

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

コード リスト 6-8単一のサーバにあるカウンタ モニタとリスナをインスタンス化する

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.monitor.CounterMonitor;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
public class ClientMonitor {
   // WebLogic ドメインの名前。この名前を変更して、インストールされているシステムの
   // 特定のドメイン名に一致させる
   private static String weblogicDomain = "mydomain";
   // WebLogic server の名前と URL。これらを変更して、インストールされているシステムの
   // 特定のサーバ名と URL に一致させる
   private static String weblogicServer = "myserver";
   private static String url = "t3://localhost:7001";
  // 管理者ロールのユーザの一連の資格。これらを変更して、
  // 使用しているセキュリティ レルムの管理者名に一致させる
   private static String username = "weblogic";
   private static String password = "weblogic";
   public static void main(String Args[]) {
      try {
         // MBeanServer インタフェースを取得する。これは、
         // クライアント サイドからモニタを作成/登録する場合に必要
         MBeanServer rmbs = null;
         Hashtable props = new Hashtable();
         props.put(Context.PROVIDER_URL, url);
         props.put(Context.INITIAL_CONTEXT_FACTORY,
            "weblogic.jndi.WLInitialContextFactory");
         props.put(Context.SECURITY_PRINCIPAL, username);
         props.put(Context.SECURITY_CREDENTIALS, password);
         InitialContext ctx = new InitialContext(props);
         rmbs = (MBeanServer) ctx.lookup("weblogic.management.server");
         // CounterMonitor オブジェクトの objectName を作成する
         ObjectName monitorObjectName = new ObjectName(
            "mcompany:Name=MyCounter,Type=CounterMonitor");
         // モニタ MBean を作成する
         rmbs.createMBean(
            "javax.management.monitor.CounterMonitor", monitorObjectName);
         // MBean 属性を使ってモニタ オブジェクトをコンフィグレーションする
         AttributeList monitorAttributes = new AttributeList();
         // 観察対象 MBean の objectName を作成する
         ObjectName qObjectName = new ObjectName(weblogicDomain
            + ":Name=weblogic.kernel.Default,Location=" + weblogicServer
            + ",Type=ExecuteQueueRuntime,ServerRuntime=" + weblogicServer);
         Attribute observedObjectAttribute = new Attribute("ObservedObject",
            qObjectName);
         monitorAttributes.add(observedObjectAttribute);
         Attribute observedAttributeAttribute = 
            new Attribute("ObservedAttribute", "ServicedRequestTotalCount");
         monitorAttributes.add(observedAttributeAttribute);
         Attribute notifyAttribute = new Attribute("Notify", new Boolean(true));
         monitorAttributes.add(notifyAttribute);
         // CounterMonitor オブジェクトをコンフィグレーションするときに使用する、
         // 一連の変数を定義する
         Integer threshold = new Integer(10);
         Integer offset = new Integer(1);
         Attribute thresholdAttribute = new Attribute("Threshold", threshold);
         monitorAttributes.add(thresholdAttribute);
         Attribute offsetAttribute = new Attribute("Offset", offset);
         monitorAttributes.add(offsetAttribute);
         monitorAttributes = rmbs.setAttributes(monitorObjectName,
            monitorAttributes);
         // 使用するリスナをインスタンス化してモニタに登録する
         CounterListener listener = new CounterListener();
         rmbs.addNotificationListener(monitorObjectName, listener, null, null);
         // モニタを起動する
         Object[] params = new Object[0];
         String[] signature = new String[0];
         rmbs.invoke(monitorObjectName, "start", params, signature);
          // クライアントのプログラムから抜け出ることを回避する
         synchronized (listener) {
            try {
               listener.wait();
            } catch (InterruptedException ignore) {
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

例 : 複数のサーバ上の MBean インスタンスのモニタ

WebLogic Server ドメインはサーバ インスタンスごとに MBean のセットを保持します。たとえば、各サーバ インスタンスは自身の ServerRuntimeMBeanLogMBean、および ExecuteQueueRuntimeMBean をホストします。管理サーバに接続すると、その接続だけでこれらすべての MBean インスタンスにアクセスできるので便利です。この 1 つの接続で、ドメイン内のあらゆるサーバ上の MBean に対してモニタ MBean を作成することもできます。たとえば、使用している JMX クライアントから管理サーバに接続し、各管理対象サーバにカウンタ モニタ MBean を作成して、サーバの ExecuteQueueRuntimeMBean をモニタする、といったことが可能です。

この方法を使用する JMX クライアントには、weblogic.management.MBeanHome および weblogic.management.runtime.ServerRuntimeMBean クラスをインポートする必要があります。

ドメイン内の各サーバ インスタンスにある ExecuteQueueRuntimeMBean のインスタンスをモニタするために、コード リスト 6-9 の抜粋コードは次のように機能します。

  1. ドメインの管理 MBeanHome を取得します。
  2. 管理 MBeanHome インタフェースを使用すると、クライアントから、ドメイン内のすべてのアクティブなサーバ インスタンスにアクセスできます。また、その際に、各サーバ インスタンスのリスン アドレスやリスン ポートを判別したり、サーバ インスタンスが現在アクティブかどうかを判断したりする必要がありません。

  3. MBeanHome.getMBeansByType を呼び出して、ドメイン内の ServerRuntimeMBean のすべてのインスタンスを取得します。
  4. 現時点で実行中のサーバにのみ ServerRuntimeMBean インスタンスが保持されます。サーバが実行中でない場合、MBeanHome.getMBeansByType メソッドからサーバの ServerRuntimeMBean は返されません。

  5. このコードでは、各 ServerRuntimeMBean について次の処理を行います。
    1. 管理サーバの JNDI ツリーから、対応するサーバのローカル MBeanHome インタフェースを取得する。
    2. 管理サーバの JNDI ツリーには、各管理対象サーバのローカル MBeanHome インタフェースへの参照が含まれています。ServerRuntimeMBean.getName() メソッドを使用すると、サーバ インスタンスの名前が返されます。この戻り値に MBeanHome.JNDI_NAME を加えたものがサーバのローカル MBeanHome インタフェースの JNDI 名です。

    3. MBeanHome.getMBeanSever() メソッドを使用して、ローカル サーバの javax.management.MBeanServer インタフェースを取得する。

このコードでローカル サーバの MBeanServer インタフェースを取得した後には、コード リスト 6-8 に示したモニタ MBean の作成処理に進めます。

コード リスト 6-9 複数のサーバ インスタンス上でのモニタのインスタンス化

import weblogic.management.MBeanHome;
import weblogic.management.runtime.ServerRuntimeMBean;
...
// 管理ホームを取得する
MBeanHome adminhome = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
// 実行中の管理対象サーバのリストを取得して、そのリストを反復処理する
Set srSet = adminhome.getMBeansByType("ServerRuntime");
Iterator sr_iter = srSet.iterator();
while (sr_iter.hasNext()) {
   ServerRuntimeMBean bean = (ServerRuntimeMBean) sr_iter.next();
   // Get the local home for the managed server
   MBeanHome localhome =
      (MBeanHome) ctx.lookup(MBeanHome.JNDI_NAME + "."+ bean.getName());
   // 管理対象サーバの MBeanServer を取得する
   MBeanServer rmbs = localhome.getMBeanServer();
...// モニタ MBean を作成するコード
}

CounterMonitor オブジェクトのコンフィグレーション

CounterMonitor オブジェクトは、整数で表される MBean 属性の変更を観察します。次に、CounterMonitor インスタンスの一般的なコンフィグレーションを行うために設定する一連の CounterMonitor 属性を示します。

CounterMonitor インスタンスで可能なすべてのコンフィグレーションについては、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

GaugeMonitor オブジェクトのコンフィグレーション

GaugeMonitor オブジェクトは、整数または浮動小数点で表される MBean 属性の変更を観察します。次に、GaugeMonitor インスタンスの一般的なコンフィグレーションを行うために使用する一連の GaugeMonitor の属性およびオペレーションを示します。

GaugeMonitor ではオフセットや係数はサポートされません。

GaugeMonitor インスタンスで可能なすべてのコンフィグレーションについては、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

StringMonitor オブジェクトのコンフィグレーション

StringMonitor オブジェクトは、文字列で表される MBean 属性の変更を観察します。次に、StringMonitor インスタンスの一般的なコンフィグレーションを行うために設定する一連の StringMonitor の属性を示します。

StringMonitor インスタンスで可能なすべてのコンフィグレーションについては、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次