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

目次
目次

戻る
戻る
 
次へ
次へ
 

4 JMX を使用した WebLogic Server MBean へのアクセス

以下の節では、JMX クライアントから WebLogic Server MBean にアクセスする方法について説明します。

リモート クライアントのクラスパスの設定

JMX クライアントが独自の JVM (つまり、WebLogic Server インスタンスでない JVM) で実行される場合は、クライアントのクラスパスに次の JAR ファイルを含めます。

WL_HOME\lib\wljmxclient.jar 

WL_HOME は、WebLogic Server のインストール先ディレクトリです。

この JAR には、HTTP プロトコルと IIOP プロトコルの Oracle 実装が含まれます。Oracle 実装を使用する場合は、JMX クライアントが接続要求とともにログイン資格を送信し、WebLogic Server のセキュリティ フレームワークがクライアントを認証します。認証されたクライアントだけが、WebLogic Server MBean サーバに登録されている MBean にアクセスできます。


注意 :

HTTP プロトコルと IIOP プロトコルの Oracle 実装を使用することをお勧めしますが、JMX クライアントでは標準の JDK で定義されている IIOP プロトコルを使用することもできます。「JDK クラスのみを使用したリモート接続」を参照してください。T3 プロトコルが指定されている場合、IIOP を使用するようクライアントで自動的に変換されます。

MBean サーバへのリモート接続の作成

各 WebLogic Server ドメインには 3 種類の MBean サーバが含まれており、それぞれの MBean サーバが別々の MBean 階層へのアクセスを提供します。「MBean サーバ」を参照してください。

WebLogic MBean サーバに接続するには、次の手順に従います。

  1. javax.management.remote.JMXServiceURL オブジェクトを作成して、MBean サーバのアドレスを記述します。

    以下のパラメータの値をコンストラクタに渡します。(http://java.sun.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html で J2SE 6.0 API 仕様の JMXServiceURL を参照してください。)

    • MBean サーバとの通信に使用するプロトコルとして、以下の値からいずれか 1 つ。

      t3, t3s, http, https, iiop, iiops 
      
    • MBean サーバをホストする WebLogic Server インスタンスのリスン アドレス。

    • WebLogic Server インスタンスのリスン ポート。

    • MBean サーバの絶対 JNDI 名。JNDI 名の先頭には /jndi/ を指定し、その後には表 4-1で説明する JNDI 名のいずれかを続ける必要があります。

    表 4-1 WebLogic MBean サーバの JNDI 名

    MBean サーバ JNDI 名

    ドメイン実行時 MBean サーバ

    weblogic.management.mbeanservers.domainruntime
    

    実行時 MBean サーバ

    weblogic.management.mbeanservers.runtime
    

    編集 MBean サーバ

    weblogic.management.mbeanservers.edit
    

  2. javax.management.remote.JMXConnector オブジェクトを作成します。このオブジェクトには、JMX クライアントが MBean サーバへの接続に使用するメソッドがあります。

    JMXConnector のコンストラクタ メソッドは、以下のとおりです。

    javax.management.remote.JMXConnectorFactory.
    connector(JMXServiceURL serviceURL, Map<String,?> environment) 
    

    以下のパラメータの値をコンストラクタに渡します。(http://java.sun.com/javase/6/docs/api/javax/management/remote/JMXConnectorFactory.html で J2SE 6.0 API 仕様の JMXConnectorFactory を参照してください。)

    • 前の手順で作成した JMXServiceURL オブジェクト。

    • 以下の名前と値のペアを含むハッシュ マップ。

      javax.naming.Context.SECURITY_PRINCIPAL, admin-user-name 
      
      javax.naming.Context.SECURITY_CREDENTIALS, admin-user-password 
      
      javax.management.remote.JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, 
      "weblogic.management.remote" 
      

    weblogic.management.remote パッケージは、WebLogic MBean サーバへの接続に使用できるプロトコルを定義します。リモート JMX クライアントは、クラスパスにこのパッケージのクラスを含める必要があります。「リモート クライアントのクラスパスの設定」を参照してください。

    必要に応じて、以下の名前と値のペアをハッシュ マップに含めます。

    jmx.remote.x.request.waiting.timeout, milliseconds 
    

    milliseconds は、JMX クライアントが MBean サーバ メソッドの呼び出しが返されるまで待機するミリ秒数が格納された java.lang.Long オブジェクトです。メソッドがタイムアウト期間の終了までに返されない場合、クライアントは次の命令セットに移動します。デフォルトでは、クライアントはメソッドが返されるのを無期限に待機します。MBean サーバが呼び出しを完了できない場合には、JMX クライアントは無期限にハングします。

  3. JMXConnector.getMBeanServerConnection() メソッドを呼び出して、WebLogic MBean サーバに接続します。

    このメソッドは、javax.management.MBeanServerConnection 型のオブジェクトを返します。

    MBeanServerConnection オブジェクトは、WebLogic MBean サーバへの接続であり、ローカル接続にもリモート接続にも使用できます。(http://java.sun.com/javase/6/docs/api/javax/management/MBeanServerConnection.html) で J2SE 6.0 API 仕様の MBeanServerConnection を参照してください。

  4. クライアントが作業を終了したら、JMXConnector.close() メソッドを呼び出して MBean サーバとの接続を閉じることをお勧めします。

例 : ドメイン実行時 MBean サーバへの接続

コード リスト 4-1 のコードに関する以下の点に留意してください。

  • クラスは、グローバル変数 connection および connector を使用して、MBean サーバへの接続を表す。connection 変数および connector 変数に値を割り当てる initConnection() メソッドは、クラス内で再利用できる 1 つの接続を確立するためにクラス インスタンスごとに一度だけ呼び出される必要があります。

  • initConnection() メソッドは、クラスがインスタンス化されるときに渡される引数として、(サーバのリスン アドレスとリスン ポートとともに) ユーザ名とパスワードを取る。暗号化されていないユーザ資格がコード内に含まれないようにするため、この方法をお勧めします。これらの引数を保持する String オブジェクトは破棄され、JVM のガベージ コレクション ルーチンによってメモリから削除されます。

  • クライアントは、jmx.remote.x.request.waiting.timeout 環境パラメータを 10000 に設定するので、MBean サーバ メソッド呼び出しはすべて、呼び出し後 10000 ミリ秒以内にメソッドが返されなければ、タイムアウトする。

  • クラスが作業を終了したら、JMXConnector.close() メソッドを呼び出して MBean サーバとの接続を閉じる (http://java.sun.com/javase/6/docs/api/javax/management/remote/JMXConnector.html で J2SE 6.0 API 仕様の JMXConnector を参照してください。)

コード リスト 4-1 ドメイン実行時 MBean サーバへの接続

public class MyConnection {

   private static MBeanServerConnection connection;
   private static JMXConnector connector;
   private static final ObjectName service;
   /*
   * ドメイン実行時 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");
      h.put("jmx.remote.x.request.waiting.timeout", new Long(10000));
      connector = JMXConnectorFactory.connect(serviceURL, h);
      connection = connector.getMBeanServerConnection();
   }

   public static void main(String[] args) throws Exception {
      String hostname = args[0];
      String portString = args[1];
      String username = args[2];
      String password = args[3];

      MyConnection c= new MyConnection();
      initConnection(hostname, portString, username, password);
...
      connector.close();
   }
}

ベスト プラクティス : MBean サーバの選択

WebLogic Server ドメインは 3 種類の MBean サーバを保持しており、それぞれの MBean サーバが特定の機能を実行します。以下のように、実行しようとしているタスクをサポートしている MBean サーバを介して MBean にアクセスします。

  • ドメインのコンフィグレーションを変更するには、編集 MBean サーバを使用する。

  • 保留中のコンフィグレーション MBean の階層に対する変更をモニタするには、編集 MBean サーバを使用する。

  • アクティブなコンフィグレーション MBean (実行時 MBean ではない) のみをモニタするには、実行時 MBean サーバを使用する。

    実行時 MBean サーバを使用したモニタのほうが、ドメイン実行時 MBean サーバを使用したモニタより、使用するメモリとネットワーク トラフィックの量が小さくなります (WebLogic Server は、クライアントが接続を要求するまでドメイン実行時 MBean サーバを初期化しません)。

    ほとんどの場合、ドメイン内のすべてのサーバ インスタンスは同じコンフィグレーション データのセットを保持しているため、管理サーバまたは管理対象サーバどちらの実行時 MBean サーバをモニタするかは重要ではありません。ただし、サーバを再起動しないと消費できない変更を行うと、サーバは変更を受け入れなくなり、そのサーバのコンフィグレーション データが古くなるおそれがあります。この場合、このサーバの実行時 MBean サーバをモニタすることは、その特定のサーバ インスタンスのコンフィグレーションのみをモニタすることになります。WebLogic Server ドメインの変更および変更のアクティブ化のプロセスを理解するには、『Oracle Fusion Middleware Oracle WebLogic Server ドメインのコンフィグレーションについて』の「コンフィグレーションの変更の管理」を参照してください。

  • クライアントが複数のサーバの実行時 MBean をモニタする場合や、クライアントが別の JVM で実行されている場合は、ドメイン内の各サーバ インスタンス上のそれぞれの実行時 MBean サーバに個別に接続するのではなく、管理サーバ上のドメイン実行時 MBean サーバに接続することをお勧めする。

    ドメイン実行時 Mbean サーバの Mbean に JMX リスナとフィルタを登録する場合は、JMX フィルタを、それがモニタする MBean と同じ JVM で実行します。たとえば、ある管理対象サーバ上の MBean にフィルタを登録する場合は、フィルタをその管理対象サーバで実行し、フィルタ条件を満たすメッセージのみをリスナに転送します。

    一般的に、ドメイン実行時 MBean サーバを使用するコードのほうが、各サーバ インスタンス上の実行時 MBean サーバを使用するコードより管理がしやすく安全性も高くなっています。その理由は以下のとおりです。

    • コードでは、管理サーバ上のドメイン実行時 MBean サーバに接続するための 1 つの URL を作成するだけでよい。以後、コードですべてのサーバ インスタンスの値をルックアップしたり、必要に応じて結果をフィルタ処理したりできます。

    • コードで実行時 MBean サーバを使用して複数のサーバ インスタンス上の MBean の値を読み込む場合には、各サーバ インスタンス用の URL を作成する必要があり、URL ごとにユニークなリスン アドレスとリスン ポートの組み合わせが必要になる。

    • 管理サーバのセキュアな管理ポートを介して WebLogic Server ドメイン内のすべての管理トラフィックをルーティングでき、ファイアウォールを使用して管理対象サーバの管理ポートへのファイアウォール外部からの接続を回避できる。

    ドメイン実行時 MBean サーバを使用してすべての JMX リクエストを転送することによるトレードオフとして、ネットワーク レイテンシとメモリ使用量の増加のためにパフォーマンスが若干低下します。MBean の値を読み込むために各管理対象サーバの実行時 MBean サーバに直接接続すると、ドメイン実行時 MBean サーバが管理対象サーバから値を取得するために作成するネットワーク ホップはなくなりますが、ドメイン実行時 MBean サーバを使用することで実現する簡素化されたコードの保守と強化されたセキュリティのほうが、ほとんどのネットワーク トポロジとパフォーマンス要件に適しています。

図 4-1 ドメイン実行時 MBean サーバと実行時 MBean サーバ

図 4-1 の後には説明を記載します。
「図 4-1 ドメイン実行時 MBean サーバと実行時 MBean サーバ」の説明

JDK クラスのみを使用したリモート接続

リモート JMX クライアントからの接続では WebLogic Server クラスを使用することをお勧めします。ただし、リモート JMX クライアントで JDK のクラスのみを使用して WebLogic Server JMX エージェントに接続することもできます。そのためには、次の手順に従います。

  1. wljmxclient.jarwlclient.jarクライアント クラスパスに指定しない場合、

    1. MBean をホストする WebLogic Server インスタンスの IIOP プロトコルを有効にします。

    2. 管理者特権を持つ WebLogic Server ユーザになるように、デフォルトの IIOP ユーザをコンフィグレーションします。

    Administration Console オンライン ヘルプの「IIOP の有効化とコンフィグレーション」を参照してください。

    wljmxclient.jarwlclient.jar クライアント クラスパスに指定した場合、デフォルトの IIOP ユーザを有効にする必要はありません。手順 2 に進みます。


    注意 :

    wlclient.jarwljmxclient.jar の MANIFEST ClassPath エントリにあるので、wlclient.jarwljmxclient.jar は同じディレクトリにあるか、または両方のjarはクラスパスで指定する必要があります。

    クラスパスに wljmxclient.jar がある場合、weblogic.jar または wlfullclient.jar は、クラスパスに含まれていないことを確認してください。シン クライアント wljmxclient.jar/wlclient.jar またはシック クライアント wlfullclient.jar のみ使用し、両方のクライアントを組み合わせて使用しないでください。


  2. JMX クライアントで、javax.management.JMXConnector オブジェクトを次のように作成します。

    String hostname = "WLS-host" 
    int port = WLS-port 
    String protocol = "iiop";
    String jndiroot= new String("/jndi/iiop://" + hostname + ":" + 
           port + "/");
    String mserver = "MBean-server-JNDI-name";
    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);
    connector = JMXConnectorFactory.connect(serviceURL, h); 
    

    WLS-hostWLS-port は WebLogic Server インスタンスのリスン アドレスとリスン ポートであり、MBean-server-JNDI-name表 4-1 に示した値のいずれかです。

作成するハッシュ テーブルには、プロトコル パッケージの名前が含まれていません。この値を null のままにしておくことで、JMX クライアントは JDK の com.sun.jmx.remote.protocol パッケージからプロトコル定義を使用します。

実行時 MBean サーバへのローカル接続の作成

ローカル クライアントは、JMXServiceURL オブジェクトを作成するのではなく、JNDI ツリーを介して WebLogic Server インスタンスの実行時 MBean サーバにアクセスできます。


注意 :

ドメイン実行時 MBean サーバへのローカル接続の作成」の説明に従って、ローカル クライアントは、JNDI ツリーを介して WebLogic Server のドメイン実行時 MBean サーバにもアクセスできます。

JNDI からアクセスされると、実行時 MBean サーバはその javax.management.MBeanServer インタフェースを返します。このインタフェースには、MBeanServerConnection インタフェースのすべてのメソッドと、ローカル プロセスがカスタム MBean の登録に使用する registerMBean() などの追加のメソッドがあります。 (http://java.sun.com/javase/6/docs/api/javax/management/MBeanServer.htmlJ2SE 6.0 API 仕様MBeanServer を参照してください。)

JMX クライアントのクラスが、EJB または Web アプリケーションなどの Java EE モジュールにある場合、実行時 MBeanServerの JNDI 名は次のようになります。

java:comp/env/jmx/runtime

たとえば、

InitialContext ctx = new InitialContext();
server = (MBeanServer)ctx.lookup("java:comp/env/jmx/runtime"); 

JMX クライアントのクラスが Java EE モジュールの一部ではない場合、実行時 MBean サーバの JNDI 名は次のようになります。

java:comp/jmx/runtime 

ドメイン実行時 MBean サーバへのローカル接続の作成

ローカル クライアントは、JMXServiceURL オブジェクトを作成するのではなく、JNDI ツリーを介して WebLogic Server インスタンスのドメイン実行時 MBean サーバにアクセスできます。

JNDI からアクセスされると、ドメイン実行時 MBean サーバはその javax.management.MBeanServer インタフェースを返します。このインタフェースには、MBeanServerConnection インタフェースのすべてのメソッドと、ローカル プロセスがカスタム MBean の登録に使用する registerMBean() などの追加のメソッドの他に getMBeanCount()instatiate()、と getClassLoader() などのメソッドもあります。 (http://java.sun.com/javase/6/docs/api/javax/management/MBeanServer.htmlJ2SE 6.0 API 仕様MBeanServer を参照してください。)


注意 :

ベストプラクティスとして、Oracle では、ドメイン実行時 MBean サーバをドメイン全体の操作を実行する MBeanにのみ使用することをお勧めします。MBean の処理とネットワーク アクティビティにより管理サーバの処理速度が低下し、管理操作の開始が回避されていないことを確認してください。

JMX クライアントのクラスが、EJB または Web アプリケーションなどの Java EE モジュールにある場合、ドメイン実行時 MBeanServerの JNDI 名は次のようになります。

java:comp/env/jmx/domainRuntime

たとえば、

InitialContext ctx = new InitialContext();
server = (MBeanServer)ctx.lookup("java:comp/env/jmx/domainRuntime"); 

JMX クライアントのクラスが Java EE モジュールの一部ではない場合、ドメイン実行時 MBean サーバの JNDI 名は次のようになります。

java:comp/jmx/domainRuntime 

ドメイン実行時 MBean サーバは、管理サーバ上にのみ存在します。呼び出し ctx.lookup() は、ローカル MBeanServer に参照を返すため、ルックアップ メソッドは管理サーバ上で実行する場合にのみ呼び出すことができます。管理対象サーバ上で実行するときに呼び出された場合、NameNotFound 例外が送出されます。

MBean 階層内の移動

WebLogic Server は、MBean を階層データ モデルにまとめます (「WebLogic Server MBean のデータ モデル」を参照してください。) このモデルでは、すべての親 MBean に自身の子のオブジェクト名を保持する属性が含まれています。標準の JMX API で子のオブジェクト名を使用して、子 MBean の属性の値を取得または設定したり、そのメソッドを呼び出したりします。

WebLogic Server MBean 階層を移動するには、次の手順に従います。

  1. MBean サーバへの接続を開始します。

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

    接続を開始すると、次の型のオブジェクトを返します。

    javax.management.MBeanServerConnection
    
  2. MBeanServerConnection.getAttribute(ObjectName object-name, String attribute) メソッドを呼び出して、MBean 階層のルートにある MBean のオブジェクト名を取得します。各値の説明は次のとおりです。

    • object-name は、MBean サーバに登録されているサービス MBean のオブジェクト名。 (「サービス MBean」を参照してください。)

      表 2-3 には、各種の MBean サーバで使用可能なサービス MBean のタイプが示されています。

    • attribute は、ルート MBean を含むサービス MBean 属性の名前。

  3. 次のようなコードを連続して呼び出します。

    ObjectName on = 
    MBeanServerConnection.getAttribute(object-name, attribute) 
    

    各値の説明は次のとおりです。

    • object-name は、MBean 階層内の現在のノード (MBean) のオブジェクト名。

    • attribute は、子 MBean の 1 つまたは複数のインスタンスを含む、現在の MBean の属性の名前。属性に複数の子がある場合は、その出力をオブジェクト名の配列 ObjectName[] に割り当てます。

MBean 階層での MBean の場所を判別するには、『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』でその MBean の説明を参照してください。WebLogic Server MBean リファレンスでは、各 MBean について、現在の MBean のファクトリ メソッドを保持する親 MBean が記載されています。ファクトリ メソッドがパブリックでない MBean については、『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』現在の MBean にアクセスできる他の MBean が記載されています。

例 : サーバの名前と状態の出力

コード リスト 4-2 のサンプル コードでは、ドメイン実行時 MBean サーバに接続し、DomainRuntimeServiceMBean を使用してドメイン内の各 ServerRuntimeMBean のオブジェクト名を取得します。その後、各サーバの ServerRuntimeMBeanName 属性および State 属性の値を取得し、出力します。

コード リスト 4-2 のコードに関する以下の点に留意してください。

コード リスト 4-2 例 : サーバの名前と状態の出力

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class PrintServerState {

   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.
             mbeanservers.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();
   }

   /* 
   * ServerRuntimeMBean の配列を出力する。
   * この MBean は実行時 MBean 階層のルートであり、
   * ドメイン内の各サーバは独自のインスタンスをホストする。
   */
   public static ObjectName[] getServerRuntimes() throws Exception {
      return (ObjectName[]) connection.getAttribute(service,
         "ServerRuntimes");
   }

   /* 
   * ServerRuntimeMBean を反復処理して、名前と状態を取得する
   */
   public void printNameAndState() throws Exception {
      ObjectName[] serverRT = getServerRuntimes();
      System.out.println("got server runtimes");
      int length = (int) serverRT.length;
      for (int i = 0; i < length; i++) {
         String name = (String) connection.getAttribute(serverRT[i],
            "Name");
         String state = (String) connection.getAttribute(serverRT[i],
            "State");
         System.out.println("Server name: " + name + ". Server state: "
            + state);
      }
   }

   public static void main(String[] args) throws Exception {
      String hostname = args[0];
      String portString = args[1];
      String username = args[2];
      String password = args[3];

      PrintServerState s = new PrintServerState();
      initConnection(hostname, portString, username, password);
      s.printNameAndState();
      connector.close();
   }
}

例 : サーブレットのモニタ

Web アプリケーションの各サーブレットは、サーブレットの実行時状態に関する情報を保持する ServletRuntimeMBean のインスタンスを提供します (『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「ServletRuntimeMBean」を参照してください。)

WebLogic Server のデータ モデルでは、ServletRuntimeMBean へのパスは次のようになります。

  1. ドメイン実行時 MBean サーバ (ドメイン内の全サーバ上にあるすべてのサーブレット用)、または特定のサーバ インスタンス上の実行時 MBean サーバ。

  2. DomainRuntimeServiceMBean または RuntimeServiceMBeanServerRuntimes 属性。

  3. ServerRuntimeMBeanApplicationRuntimes 属性。

  4. ApplicationRuntimeMBeanComponentRuntimes 属性。

    ComponentRuntimes 属性には、さまざまなタイプのコンポーネントの実行時 MBean が保持されます。それらの 1 つが WebAppComponentRuntimeMBean です。この属性の値を取得したら、子 MBean の Type 属性を使用して特定のタイプのコンポーネントの実行時 MBean を取得します。

  5. WebAppComponentRuntimeMBeanServletRuntimes 属性。

コード リスト 4-3 のコードでは、上記の節で説明したように階層を移動し、ServletRuntimeMBean の値を取得します。

コード リスト 4-3 サーブレットのモニタ

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class MonitorServlets {
   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.mbeanser
           vers.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();
   }

   /*
   * ServerRuntimeMBean の配列を取得する
   */
   public static ObjectName[] getServerRuntimes() throws Exception {
      return (ObjectName[]) connection.getAttribute(service,
         "ServerRuntimes");
   }

   /*
   * WebAppComponentRuntimeMBean の配列を取得する
   */
   public void getServletData() throws Exception {
      ObjectName[] serverRT = getServerRuntimes();
      int length = (int) serverRT.length;
      for (int i = 0; i < length; i++) {
         ObjectName[] appRT = 
            (ObjectName[]) connection.getAttribute(serverRT[i],
            "ApplicationRuntimes");
         int appLength = (int) appRT.length;
         for (int x = 0; x < appLength; x++) {
            System.out.println("Application name: " +
              (String)connection.getAttribute(appRT[x], "Name"));
            ObjectName[] compRT = 
               (ObjectName[]) connection.getAttribute(appRT[x],
               "ComponentRuntimes");
            int compLength = (int) compRT.length;
            for (int y = 0; y < compLength; y++) {
               System.out.println("  Component name: " +
                 (String)connection.getAttribute(compRT[y], "Name"));
               String componentType = 
                  (String) connection.getAttribute(compRT[y], "Type");
               System.out.println(componentType.toString());
               if (componentType.toString().equals("WebAppComponentRuntime")){
                  ObjectName[] servletRTs = (ObjectName[])
                     connection.getAttribute(compRT[y], "Servlets");
                  int servletLength = (int) servletRTs.length;
                  for (int z = 0; z < servletLength; z++) {
                     System.out.println("    Servlet name: " +
                        (String)connection.getAttribute(servletRTs[z],
                         "Name"));
                     System.out.println("       Servlet context path: " +
                        (String)connection.getAttribute(servletRTs[z],
                         "ContextPath"));
                     System.out.println("       Invocation Total Count : " +
                        (Object)connection.getAttribute(servletRTs[z],
                         "InvocationTotalCount"));
                  }
               }
            }
         }
      }
   }

   public static void main(String[] args) throws Exception {
      String hostname = args[0];
      String portString = args[1];
      String username = args[2];
      String password = args[3];

      MonitorServlets s = new MonitorServlets();
      initConnection(hostname, portString, username, password);
      s.getServletData();
      connector.close();
   }
}