BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

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

 Previous Next Contents Index PDF で侮ヲ  

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 に登録します。

図 5-1 に、MBean がブロードキャストした通知のサブセットのみを受信する NotificationListener の基本的な仕組みを示します。

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


 

JMX 通知とその仕組みの詳しい説明が必要な場合は、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html から JMX 1.0 仕様をダウンロードしてください。

 


MBean 内での変更のモニタ

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

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

モニタ MBean を使用するには、モニタをコンフィグレーションして WebLogic Server MBean に登録します。 次に、リスナ クラスを作成してモニタ MBean に登録します。 モニタ MBean は特定のタイプの通知のみを送信するため、モニタ MBean からの通知をリスンする場合はフィルタを使用しないのが一般的です。

図 5-2 に、WebLogic Server MBean に登録されたモニタ MBean の基本的な仕組みを示します。 モニタ MBean に登録された NotificationListener は、モニタ MBean 内の条件が満たされたときに通知を受信します。

図5-2 モニタ MBean


 

 


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

WebLogic Server では、MBean 内での変更に関する通知を 2 つの方法で送信できます。1 つはリスナを作成して MBean に直接登録する方法 (図 5-1 を参照)、もう 1 つは MBean を定期的に観察するモニタ MBean をコンフィグレーションし、属性値が所定の条件を満たしたときに通知を送信する方法 (図 5-2 を参照) です。 どちらの方法を選ぶかは、通知を受信する際の要件の複雑さによって決まります。

要件が単純な場合は、リスナを MBean に直接登録する方法をお勧めします。 NotificationListener インタフェースおよび NotificationFilter インタフェースをリスナやフィルタに実装することで、値をしきい値などの値と比較することも可能です。 ただし、通知内のデータを評価して応答するには、独自のコードを作成する必要があります。 リスナを MBean に直接登録する利点は、通知が MBean からリスナに送信されるため、変更がほぼ即座に通知される点です。

モニタ MBean は、通知の要件が非常に複雑な場合や、MBean 属性の単一の変更とは直接関係のない複数の変更をまとめてモニタしたい場合に使用します。 モニタ MBean には、非常に特殊な状況下でデータを比較したり通知を送信したりするためのさまざまなツールが用意されています。 ただし、モニタは MBean を定期的にポーリングして属性値の変更を観察するため、指定したポーリング間隔でしか変更を通知できません。

 


ベスト プラクティス : よくモニタする属性

表 5-3 に、WebLogic Server のパフォーマンスの概況を表す属性を示します。 これらの属性は、リスナを作成して MBean に直接登録する方法でも、モニタ MBean をコンフィグレーションする方法でもモニタできます。

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

表 5-3 の情報は、各 MBean の WebLogicObjectName の構築に使用します。 表中の domain は WebLogic Server ドメインの名前、server はモニタする MBean をホストする WebLogic Server インスタンスの名前です。

表 5-3 よくモニタする WebLogic Server 属性

MBean と属性名

説明

MBean タイプ : ServerRuntime

属性名 : State

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

例 :
examples:Location=ExamplesServer,Name=
ExamplesServer,Type=ServerRuntime

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

MBean タイプ : ServerRuntime

属性名 : OpenSocketsCurrentCount

この MBean の WebLogicObjectName:
上の行を参照

これら 2 つの属性を組み合わせることで、サーバのリスン ポートにおける現在のアクティビティを、ポートにバックログできる要求の総数と比較できる。

これらの属性は、以下のように別々の MBean に格納されていることに注意。

  • OpenSocketsCurrentCountServerRuntime MBean に格納

  • AcceptBacklogServer コンフィグレーション MBean に格納

MBean タイプ : Server

属性名 : AcceptBacklog

この MBean の WebLogicObjectName:
domain:Name=server,Type=Server

例 :
examples:Name=ExamplesServer,Type=
Server

MBean タイプ : ExecuteQueueRuntime

属性名 : ExecuteThreadCurrentIdleCount

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

例 :
examples:Location=ExamplesServer,Name=
default,ServerRuntime=ExamplesServer,
Type=ExecuteQueueRuntime

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

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

MBean タイプ : ExecuteQueueRuntime

属性名 : PendingRequestCurrentCount

この MBean の WebLogicObjectName:
上の行を参照

サーバのデフォルトの実行キューで待機している要求の数を表示する。

MBean タイプ : JVMRuntime

属性名 : HeapSizeCurrent

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

例 :
examples:Location=ExamplesServer,Name=
ExamplesServer,ServerRuntime=ExamplesServer,Type=JVMRuntime

サーバの JVM ヒープにおいて現時点で使用可能なメモリの量 (バイト) を表示する。

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

MBean タイプ : JDBCConnectonPoolRuntime

属性名 : ActiveConnectionsCurrentCount

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

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

例 :
examples:Location=ExamplesServer,Name=
MyPool-PointBase,ServerRuntime=
ExamplesServer,Type=
JDBCConnectionPoolRuntime

JDBC 接続プールにおいて現時点でアクティブな接続の数を表示する。

詳細については、「WebLogic Server のチューニング」を参照。

MBean タイプ : JDBCConnectonPoolRuntime

属性名 : ConnectionsHighCount

この MBean の WebLogicObjectName:
上の行を参照

JDBC 接続プール内のアクティブな接続の最大数。 接続プールがインスタンス化されるたびにゼロからカウントされる。


 

 


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

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

  1. どのタイプの通知をリスンするかを決めます。 WebLogic Server 通知タイプを参照してください。

  2. アプリケーションにリスナ クラスを作成します。 通知リスナの作成を参照してください。

  3. 必要に応じてフィルタ クラスを作成し、リスナが MBean から受信する通知のタイプを指定します。 通知フィルタの作成を参照してください。

  4. 通知の送信元となる MBean にリスナとフィルタを登録するための追加のクラスを作成します。 通知リスナおよびフィルタの登録を参照してください。

WebLogic Server 通知タイプ

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

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

weblogic.management 通知タイプの詳細については、AttributeAddNotificationAttributeRemoveNotification の Javadoc を参照してください。

通知リスナの作成

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

  1. 次のいずれかを実装するクラスを作成します。

  2. クラスに、次のいずれかを追加します。

    注意: 通知ブロードキャスタのブロッキングを避けるため、このメソッドの実装はできる限り早く返す必要があります。

  3. リスナが受信した通知オブジェクトからデータを取得するには、handleNotification メソッド内で通知オブジェクトに対して javax.management.Notification メソッドを呼び出します。

    たとえば、通知に関連付けられたタイム スタンプを取得するには、notification.getTimeStamp() を呼び出します。

    すべての通知タイプは javax.management.Notification の拡張であるため、以下の Notification メソッドはすべての通知に使用できます。

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

  4. ほとんどの通知タイプには、その通知固有のデータを取得するための追加のメソッドが用意されています。 たとえば、WebLogicLogNotification は、WebLogic Server ログ メッセージの特定の属性を取得するためのメソッドとして、ログ メッセージの重大度を取得する getSeverity() などのメソッドを備えています。

    通知タイプに固有の (つまり、標準の javax.management.Notification メソッドでは取得できない) データを取得するには、次の手順に従います。

    1. handleNotification メソッドに、通知をフィルタして特定のタイプの通知のみを選択するためのロジックを追加します。

    2. 通知タイプごとに用意されているメソッドを呼び出して、通知オブジェクトからデータを抽出します。

      次に例を示します。

      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 メソッドを使用して取得します。

コード リスト 5-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 を実装するシリアライズ可能なクラスを作成します。

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

    フィルタがシリアライズ可能でなければならないのは、リモート通知リスナで使用する場合のみです。 RMI で使用するクラスは、リモート JVM で分解および再構築する必要があるため、シリアライズ可能でなければなりません。

  2. isNotificationEnabled(Notification notification) メソッドを使用して、シリアライズ可能なオブジェクトが一連の条件が満たされたときに true 値を返すかどうかを指定します。

    ブール値として true が返されると、フィルタは登録されているリスナに通知を転送します。

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

リスト5-2 では、AttributeChangeNotification タイプの通知のみを転送する NotificationFilter の例を示します。

コード リスト 5-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 で動作しますが、フィルタのクラスをサーバのクラスパスに追加することで、フィルタとリスナの間でのシリアライズされたデータの伝達を最小限に抑えることができます。 詳細については、図 5-4 を参照してください。

図5-4 WebLogic Server で実行できるフィルタ

通知リスナおよびフィルタの登録

通知リスナ クラスとフィルタ クラス (省略可能) を実装したら、リスナとフィルタを MBean インスタンスに登録するための追加のクラスを作成します。 登録クラスは、モニタする MBean インスタンスごとに 1 つずつ作成する必要があります。

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

  1. MBeanHome インタフェースを取得し、MBeanHome を使用して MBeanServer インタフェースを取得するクラスを作成します。

    リスナとフィルタを管理 MBean に登録する場合は、管理サーバにしかない管理 MBeanHome を取得する必要があります。 ローカル コンフィグレーション MBean または実行時 MBean に登録する場合は、その MBean をホストするサーバ インスタンスのローカル MBeanHome を取得する必要があります。

  2. 作成したリスナ クラスとフィルタ クラスをインスタンス化します。

  3. 登録先となる MBean の WebLogicObjectName を構築します。

  4. MBeanServer インタフェースの addNotificationListener() メソッドに WebLogicObjectName、リスナ クラス、およびフィルタ クラスを渡して、リスナとフィルタを登録します。

    図 5-1 では、MBean の addNotificationListener() メソッドを呼び出してリスナとフィルタを直接 MBean に登録する場合を示しましたが、実際の場面では MBeanServer インタフェースの addNotificationListener() メソッドを使用することをお勧めします。これにより、登録のためだけに特定の MBean をルックアップする必要がなくなります。

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

次のクラス例では、リスト5-1 のリスナと リスト5-2 のフィルタを、Server1 というサーバ インスタンスの Server 管理 MBean に登録します。 この例で、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。 MBean を表示および変更するパーミッションについては、『管理者ガイド』の「システム管理操作の保護」を参照してください。

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

コード リスト 5-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 を無効にすると、管理サーバはログ メッセージを送出します。 そのようなメッセージは、ドメインのコンフィグレーションで行われた変更の証跡となります (コンフィグレーション監査)。 『管理者ガイド』の「コンフィグレーション監査」を参照してください。

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

  1. WebLogic Server のログ メッセージから情報を抽出する通知リスナを作成およびコンパイルします。

    コンフィグレーション監査メッセージの通知リスナを参照してください。

  2. コンフィグレーション監査メッセージのみを選択する通知フィルタを作成およびコンパイルします。

    コンフィグレーション監査メッセージの通知フィルタを参照してください。

  3. 管理サーバの LogBroadcasterRuntime MBean にリスナとフィルタを登録するクラスを作成およびコンパイルします。 これは、ログ メッセージを JMX 通知としてブロードキャストするのに WebLogic Server インスタンスで使用される MBean です。

    コンフィグレーション監査メッセージの登録クラスを参照してください。

  4. 管理サーバのクラスパスに通知フィルタを追加します。

    通知リスナが管理サーバの JVM 内で動作する場合 (たとえば起動クラスとして実行される場合) は、通知リスナと登録クラスも管理サーバのクラスパスに追加します。

  5. 登録クラスを呼び出すか、それを管理サーバの起動クラスとしてコンフィグレーションします。

    『管理者ガイド』の「起動クラスと停止クラスのコンフィグレーション」を参照してください。

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

リスト5-1 の通知リスナと同様に、リスト5-4 の通知リスナも RemoteNotificationListener とその handleNotification メソッドを実装します。

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

コード リスト 5-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() );
}
}

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

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

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

リソースが変更されたことを示すコンフィグレーション監査メッセージは、メッセージ ID 159904 で識別されます (『管理者ガイド』の「コンフィグレーション監査」を参照)。 送信されてくるログ通知のメッセージ ID 値がコンフィグレーション監査メッセージの ID と一致する場合、フィルタは true として評価し、そのメッセージを登録リスナに転送します。

コード リスト 5-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;
}
}
}

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

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

コード リスト 5-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";
        //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 {
//リスナ クラスをインスタンス化
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. 次の表から、モニタ タイプを選択します。

    表5-1 モニタ MBean と観察対象オブジェクトのタイプ

    モニタ MBean のタイプ

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

    CounterMonitor

    Integer

    GaugeMonitor

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

    StringMonitor

    String


     

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

モニタの通知タイプ

それぞれのタイプのモニタ MBean は、特定のタイプの javax.management.monitor.MonitorNotification 通知を送信します。 MonitorNotification.getType() メソッドを使用すると、あらゆる通知のタイプを判別できます。

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

表5-2 モニタ 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 から通知を受信したときに追加のメッセージを出力するロジックが含まれています。 このロジックを修正して、モニタ通知のタイプに応じてリスナの応答を変化させることも可能です。モニタ通知のタイプについては、モニタの通知タイプを参照してください。

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

import java.rmi.Remote;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
import weblogic.management.RemoteNotificationListener;
import weblogic.management.MBeanHome;
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("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 を単一のサーバ インスタンスに登録するには、次の手順に従います。

  1. モニタ MBean をインスタンス化してコンフィグレーションします。

  2. 観察対象の MBean をホストするサーバ インスタンスの MBeanHome インタフェースを取得します。

  3. モニタ MBean を観察対象 MBean に登録します。

モニタ MBean を複数のサーバ インスタンスに登録するには、次の手順に従います。

  1. モニタ MBean をインスタンス化してコンフィグレーションします。

  2. 観察対象 MBean のインスタンスをホストする各サーバ インスタンスMBeanHome インタフェースを取得します。

  3. 各サーバ インスタンスについて、モニタ MBean を観察対象 MBean に登録します。

以降の節では、これらの手順の例を示します。

例 : 単一のサーバにおける MBean のモニタ

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

リスト5-8 の例では、単一のサーバ インスタンスの ExecuteQueRuntimeMBean 用のカウンタ モニタを次の手順で作成します。

  1. javax.management.monitor.CounterMonitor オブジェクトをインスタンス化します。

  2. 次の手順に従って、モニタ オブジェクトをコンフィグレーションします。

    1. モニタ オブジェクト の JMX オブジェクト名を変数に割り当てます。

      リスト5-8 では WebLogicObjectName() を使用していますが、モニタ オブジェクトに対して javax.management.ObjectName を使用することもできます。オブジェクト名は WebLogic Server ドメイン全体にわたって固有にし、次の JMX 命名規約に従う必要があります。

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

    2. WebLogicObjectName() を使用して 観察対象 MBean の JMX オブジェクト名を変数に割り当てます。

      観察対象 MBean が WebLogic Server MBean の場合、javax.management.ObjectName の代わりに WebLogicObjectName() を使用する必要があります。また、MBeanHome.getMBeansByType() または他の WebLogic Server API を使用して観察対象 MBean オブジェクトの名前を取得できます。 MBean のさまざまな取得方法の例については、WebLogic Server MBean へのアクセスを参照してください。

    3. モニタのしきい値パラメータの値を設定します。使用可能なパラメータ セットは、CounterMonitorGaugeMonitorStringMonitor のうちのどれをインスタンス化するかによって異なります。

    4. モニタの API を使用してモニタ オブジェクトをコンフィグレーションします。

    モニタをコンフィグレーションするために渡すパラメータについては、以下を参照してください。

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

  4. モニタの addNotificationListener() メソッドを使用してリスナ オブジェクトを登録します。

  5. (この手順は、モニタ クラスが WebLogic Server JVM の外部の JVM で実行される場合だけに必要) 次の手順に従って、リモート JVM にある MBean サーバの参照をあらかじめ登録します。

    1. 管理 MBeanHome インタフェースを使用して、MBeanServer インタフェースを取得します。

    2. モニタの preRegister() メソッドを使用します。

  6. モニタの start() メソッドを使用してモニタを起動します。

この例で、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。 MBean を表示および変更するパーミッションについては、『管理者ガイド』の「システム管理操作の保護」を参照してください。

コード リスト 5-8 モニタとリスナのインスタンス化

import javax.management.monitor.CounterMonitor;
import javax.management.ObjectName;
import javax.naming.Context;
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 clientMonitor {
    // WebLogic ドメインの名前。ここを、インストール環境に //
// 合わせて特定のドメイン名に変更する //
private static String weblogicDomain = "mydomain";
    // WebLogic サーバの名前。ここを、インストール環境に //
// 合わせて特定のサーバ名に変更する //
private static String weblogicServer = "myserver";
    public static void main (String Args[]) {
        try {
//CounterMonitor をインスタンス化
CounterMonitor monitor = new CounterMonitor();
            // CounterMonitor オブジェクトの objectName を構築
WebLogicObjectName monitorObjectName = new
WebLogicObjectName("MyCounter",
"CounterMonitor",weblogicDomain);
            // 親 MBean の objectName を構築
WebLogicObjectName pObjectName = new
WebLogicObjectName(weblogicServer,
"ServerRuntime",weblogicDomain);
            // 観察対象 MBean の objectName を構築
WebLogicObjectName qObjectName = new
WebLogicObjectName("default",
"ExecuteQueueRuntime",weblogicDomain,
weblogicServer, pObjectName);
            // CounterMonitor オブジェクトをコンフィグレーションするときに使用する
// 変数を定義
Integer threshold = new Integer(10);
Integer offset = new Integer(1);
            //CounterMonitor API を使用してモニタ オブジェクトをコンフィグレーション
monitor.setThreshold(threshold);
monitor.setNotify(true);
monitor.setOffset(offset);
monitor.setObservedObject(qObjectName);
monitor.setObservedAttribute("ServicedRequestTotalCount");
            //リスナをインスタンス化してモニタに登録
CounterListener listener = new CounterListener();
monitor.addNotificationListener(listener, null, null);
            //管理 MBeanHome API を使用して MBeanServer インタフェースを取得
//これはモニタをクライアント側から登録する場合に // 必要
String url = "t3://localhost:7001"; //URL of the Admin Server
String username = "weblogic";
String password = "weblogic";
MBeanHome home = null;
Environment env = new Environment();
env.setProviderUrl(url);
env.setSecurityPrincipal(username);
env.setSecurityCredentials(password);
Context ctx = env.getInitialContext();
home = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
RemoteMBeanServer rmbs = home.getMBeanServer();
monitor.preRegister(rmbs, monitorObjectName);
            //モニタを起動
monitor.start();
}catch (Exception e) { e.printStackTrace(); }
}
}

例 : 複数のサーバにおける MBean のインスタンスのモニタ

WebLogic Server ドメインでは、サーバ インスタンスごとに複数の MBean インスタンスが保持されています。 たとえば、各サーバ インスタンスは独自の ServerRuntimeMBeanLogMBean、および ExecuteQueueRuntimeMBean をホストします。

一部の MBean は、サーバ インスタンスが特定のサービスをホストする場合にのみインスタンス化されます。 たとえば、Java Messaging Service (JMS) を使用する場合は、JMS 送り先として定義された各サーバ インスタンスが独自の JMSDestinationRuntimeMBean をホストします。 JMS 送り先の詳細については、『WebLogic JMS プログラマーズ ガイド』の「分散送り先の使用」を参照してください。

リスト5-9 の例では、ドメイン内の各サーバ インスタンスで JMSDestinationRuntimeMBean を次の手順でモニタします。

  1. ドメインの管理 MBeanHome を取得します。

  2. MBeanHome.getMBeansByType を呼び出して、ドメイン内の JMSDestinationRuntimeMBean のすべてのインスタンスを取得します。

  3. JMSDestinationRuntimeMBean について、GaugeMonitor オブジェクトが次の手順でインスタンス化およびコンフィグレーションされます。

    1. javax.management.monitor.GaugeMonitor のデフォルト コンストラクタを使用して GaugeMonitor オブジェクトをインスタンス化します。

    2. GaugeMonitor オブジェクトをコンフィグレーションします。

      GaugeMonitor.setObservedObject メソッドに値を提供するため、JMSDestinationRuntimeMBeanWebLogicMBean としてキャストされ、つづいて WebLogicMBean.getObjectName が呼び出されます。.

  4. GaugeMonitor オブジェクトについて GaugeMonitor.addNotificationListener メソッドが呼び出され、通知リスナがインスタンス化されてモニタに登録されます。

    通知リスナの例については、モニタ MBean 用の通知リスナの作成 を参照してください。

  5. GaugeMonitor オブジェクトについて、ホスト サーバの JVM 内の MBean サーバへの参照が次の手順で登録されます。

    1. Context.lookup(MBeanHome.JNDI_NAME.serverName) メソッドを呼び出し、管理 MBeanHome インタフェースを使用して MBeanServer インタフェースを取得します。

      lookup メソッドに serverName 値を提供するため、 JMSDestinationRuntimeMBeanWebLogicMBean キャストが参照され、その WebLogicMBean.getObjectName().getLocation() メソッドが呼び出されます。

    2. モニタの preRegister() メソッドを呼び出します。

  6. モニタの start() メソッドを使用してモニタを起動します。

  7. クラスをアクティブに保つためのコードを挿入します。 クラスを呼び出してアクティブに保つのはより大きなアプリケーションの役割であり、モニタはこうした大きなアプリケーションのコンテキストで動作するため、このコードは通常は必要ありません。 このコードが例に含まれているのは、簡単にコンパイルしてその動作を確認できるようにするためです。

  8. モニタを停止するコードを挿入します。これにより、JVM によってモニタに割り当てられたスレッドも終了します。

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

コード リスト 5-9 複数のサーバ インスタンスにおけるゲージ モニタのインスタンス化

import java.util.Set;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import javax.naming.Context;
import javax.management.monitor.GaugeMonitor;
import javax.management.ObjectName;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import weblogic.management.WebLogicMBean;
import weblogic.management.RemoteMBeanServer;
import weblogic.management.runtime.JMSDestinationRuntimeMBean;
import weblogic.management.WebLogicObjectName;
public class GaugeMonitorClient {
   public static void main (String Args[]) throws Exception {
//管理サーバの url
String url = "t3://localhost:7001";
String username = "weblogic";
String password = "weblogic";
String domain = "examples";
      try {
//管理 MBeanHome を取得
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);
         //ドメイン内の JMSDestinationRuntimeMBean インスタンスを
//すべて取得
Set mbeanSet =
home.getMBeansByType("JMSDestinationRuntime");
         System.out.println("Retrieved the following mbeans");
Iterator iter = mbeanSet.iterator();
while (iter.hasNext()){
WebLogicMBean bean = (WebLogicMBean) iter.next();
System.out.println("Name = "+bean.getName());
System.out.println("WebLogicObjectName =
"+bean.getObjectName()+"¥n");
}
         List list = Collections.synchronizedList(new ArrayList());
Iterator it = mbeanSet.iterator();
int i = 0;
while (it.hasNext()) {
//ゲージ モニタをインスタンス化
GaugeMonitor monitor = new GaugeMonitor();
//ゲージ モニタをコンフィグレーション
monitor.setThresholds(new Long("30"), new Long("4"));
monitor.setNotifyHigh(true);
monitor.setNotifyLow(true);
WebLogicMBean bean = (WebLogicMBean) it.next();
ObjectName myON = bean.getObjectName();
monitor.setObservedObject(myON);
monitor.setObservedAttribute("MessagesCurrentCount");
            //通知リスナをインスタンス化して登録
MyNotificationListener listener = new MyNotificationListener();
monitor.addNotificationListener(listener,null,null);
//モニタをあらかじめ登録して起動
MBeanHome localhome = (MBeanHome)
ctx.lookup(MBeanHome.JNDI_NAME +"."+bean.getObjectName().getLocation());
RemoteMBeanServer rmbs = localhome.getMBeanServer();
WebLogicObjectName monitorObjectName = new WebLogicObjectName
("myGaugeMonitor" + (++i), "GaugeMonitor", domain,
bean.getObjectName().getLocation());
monitor.preRegister(rmbs, monitorObjectName);
monitor.start();
System.out.println("Monitor waiting on event notification.");
list.add(monitor);
myON = null;
}
         //モニタをアクティブに保つ
System.out.println("pausing...........");
System.in.read();
         //各モニタを停止
Iterator deregisterList = list.iterator();
while (deregisterList.hasNext()) {
GaugeMonitor gauge = (GaugeMonitor) deregisterList.next();
System.out.println("deregistering...");
gauge.preDeregister();
}
return;
}
catch (Exception e){
e.printStackTrace();
}
}
}

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

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

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

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

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

GaugeMonitor はオフセットまたは係数をサポートしていません。

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

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

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

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

 


モニタ シナリオの例

この節では、パフォーマンスやリソース使用状況を監視するためにモニタする可能性のある、一部の典型的な MBean 属性について概説します。 個々の MBean の属性またはメソッドの詳細については、該当の MBean の WebLogic Server Javadoc を参照してください。

JDBC のモニタ

JDBCConnectionPoolRuntime MBean には、デプロイ済みの JDBC 接続プールへの接続状況を示すいくつかの属性があります。アプリケーションでは、これらの属性をモニタして、接続のリークだけでなく、接続の遅延および失敗を監視できます。次の表は、JDBC のモニタで通常使用される、これらの MBean 属性の概要を示しています。

表5-3 JDBC のモニタ属性

JDBCConnectionPoolRuntime MBean の属性

アプリケーションによる一般的なモニタ

LeakedConnectionCount

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

ActiveConnectionsCurrentCount

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

ConnectionDelayTime

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

FailuresToReconnect

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

 

Back to Top Previous Next