ヘッダをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server 診断フレームワークのコンフィグレーションと使い方
11g リリース 1 (10.3.1)
B55523-01
 

目次へ
目次

戻る
戻る
 
次へ
次へ
 

14 WLDF のプログラム的なコンフィグレーションと使用

前の章で説明したように、WebLogic Server Administration Console を使用して、WebLogic 診断フレームワーク (WLDF) などの WebLogic Server の機能を有効化、コンフィグレーション、およびモニタすることができます。また、JMX API と WebLogic Scripting Tool (WLST) を使用して、同じタスクをプログラム的に実行することもできます。

以下の節では、WLDF のプログラム的なコンフィグレーションについて説明します。

アプリケーションの開発とデプロイ、および WLST の使い方については、以降の節での説明に加え、以下のマニュアルも参照してください。

WLDF によるデータの生成と取得

通常、診断データは、以下のプロセスで WLDF コンポーネントによって生成および取得されます。

コンフィグレーションは主に管理タスクであり、Administration Console または WLST スクリプトを使用して行います。システム レベル (サーバおよびクラスタ) やアプリケーション レベルで診断リソースをコンフィグレーションする場合、通常はデプロイ可能な記述子モジュールである XML コンフィグレーション ファイルを使用します。(WLDF リソースのコンフィグレーションの詳細については、「WLDF コンフィグレーショについて」を参照)。

アクセサ コンポーネントによる出力の取得は、管理タスクになる場合と、プログラム的なタスクになる場合があります。

Bean およびパッケージへの WLDF コンポーネントのマッピング

Administration Console または WLST を使って WLDF リソースを作成すると、WebLogic Server は各リソースについて MBean (管理対象 Bean) を作成します。JMX または WLST を使用してこれらの MBean にアクセスできます。weblogic.WLST は JMX クライアントであるため、WLST を使用して実行できるすべてのタスクは、JMX を使用してプログラム的に実行することもできます。

表 14-1 には、WLDF およびそのコンポーネントに関係する Bean とパッケージを示します。図 14-1 では、Bean をタイプ別にグループ化しています。

図 14-1 WLDF コンフィグレーション MBean、実行時 MBean、およびシステム モジュール Bean

図 14-1 の説明は図の下のリンクをクリックしてください。
「図 14-1 WLDF コンフィグレーション MBean、実行時 MBean、およびシステム モジュール Bean」の説明

プログラミング ツール

WebLogic 診断フレームワークを使用すると、以下のタスクをプログラム的に実行できます。

コンフィグレーション API と実行時 API

コンフィグレーション API と実行時 API は、WLDF をコンフィグレーションおよびモニタします。コンフィグレーション API と実行時 API は、双方とも MBean としてエクスポーズされます。

  • コンフィグレーション MBean とシステム モジュール Bean は、WLDF リソースを作成およびコンフィグレーションし、その実行時の動作を決定する。

  • 実行時 MBean は、さまざまなコンポーネントの実行時状態および定義された処理をモニタする。

コンフィグレーション API と実行時 API を使用すると、データ収集をコンフィグレーション、アクティブ化、非アクティブ化したり、監視、通知、アラーム、診断イメージ キャプチャをコンフィグレーションしたり、データにアクセスしたりできます。

コンフィグレーション API

コンフィグレーション API は、以下の WLDF コンポーネントのコンフィグレーションに使用するインタフェースを定義します。

  • データ コレクタ : コンフィグレーション API を使用すると、インスツルメンテーション、収集、イメージ キャプチャをコンフィグレーションおよび制御できる。

    • インスツルメンテーション コンポーネントでは、サーバ レベルのインスツルメンテーションおよびインスツルメンテーション モニタを有効化、無効化、作成、および破棄できる。


      注意 :

      コンフィグレーション API では、アプリケーション レベルのインスツルメンテーションのコンフィグレーションをサポートしていません。ただし、Java Specification Request (JSR) 88 API を使用している場合、アプリケーション レベルのインスツルメンテーションに対するコンフィグレーションの変更が影響を受ける可能性があります。

    • ハーベスタ コンポーネントでは、収集する型を追加および削除したり、その型のどの属性およびインスタンスを収集するかを指定したり、ハーベスタのサンプル期間を設定したりできる。

    • 診断イメージ キャプチャ コンポーネントでは、イメージ キャプチャを格納するディレクトリの名前とパス、イベント イメージ キャプチャの間隔 (最近アーカイブされたイベントが診断イメージにキャプチャされる時間間隔) を設定できる。

  • 監視と通知 : コンフィグレーション API を使用すると、監視と通知の有効化、無効化、作成および破棄を行える。また、コンフィグレーション API を使用すると、以下のことが可能になります。

    • ルールの種類、監視ルール式、監視の重大度の設定

    • 通知に対するアラームの種類およびアラーム リセット期間の設定

    • 診断イメージ キャプチャをトリガするための監視のコンフィグレーション

    • 監視への通知の追加、および監視からの通知の削除

  • アーカイブ : アーカイブの種類およびアーカイブ ディレクトリを設定できる。

実行時 API

実行時 API は、WLDF コンポーネントの実行時の状態をモニタするためのインタフェースを定義します。これらの API のインスタンスは、個々の管理対象サーバのインスタンス上でインスタンス化されます。実行時 API は、実行時 MBean として定義されているので、JMX クライアントが簡単にアクセスできます。

実行時 API は、個々の WLDF コンポーネントの他のすべての実行時インスタンスをカプセル化します。これらの API は、weblogic.management.runtime パッケージに入っています。

実行時 API を使用すると、以下の WLDF コンポーネントをモニタできます。

  • データ コレクタ : 実行時 API を使用すると、インスツルメンテーション、ハーベスタ、イメージ キャプチャの各コンポーネントをモニタできる。

    • インスツルメンテーション コンポーネントでは、ジョインポイント数の統計、インスツルメンテーション モニタで検査されたクラスの数、変更されたクラスの数、およびインスツルメンテーション モニタでクラスの検査にかかった時間をモニタできる。

    • ハーベスタ コンポーネントでは、収集可能な型のセット、収集可能な属性、および収集可能なインスタンス (つまり、特定の型で現在収集可能なインスタンス) を問い合わせることができる。また、収集用に現在コンフィグレーションされている型、属性、およびインスタンスを問い合わせることもできます。サンプリング間隔、および収集プロセスに関するさまざまな実行時統計も利用可能です。

    • イメージ キャプチャ コンポーネントでは、診断イメージの出力先およびロックアウト期間を指定して、イメージ キャプチャを開始できる。

  • 監視と通知 : 実行時 API を使用すると、監視と通知およびアーカイブの各コンポーネントをモニタできる。

    • 監視と通知コンポーネントでは、監視アラームを設定したり、アラーム、イベント、ログ レコード、収集されたメトリックの解析に関する情報など、監視ルールの評価やトリガされた監視に関する統計をモニタしたりできる。

  • アーカイブ : ファイル名、アーカイブの統計など、アーカイブに関する情報をモニタできる。

  • データ アクセサ : 実行時 API を使用すると、別のアーカイブに保持されている診断データを取り出すことができる。また、実行時 API では、基底のアーカイブからデータを検索するクエリ式を指定できるので、データのフィルタ処理も利用できます。カラム型のマップ (診断データの対応する型名にカラム名を関連付けたマップ)、データ レコード数とタイムスタンプに関する統計、カーソル (クライアントがデータ レコードを取得するためのカーソル) に関する情報をモニタできます。

WLDF パッケージ

以下の 2 つのパッケージが用意されています。

WLDF プログラミング : サンプル

以下のサンプルでは、WLDF Bean およびパッケージを使用し、実行中のサーバの情報にアクセスして変更します。

また、「WebLogic Scripting Tool のサンプル」の WLST および JMX のサンプルも参照してください。

サンプル : DiagnosticContextExample.java

次のサンプルでは、weblogic.diagnostics.context パッケージの DiagnosticContextHelper クラスを使用して、DYE_0 フラグの値を取得および設定します。診断コンテキストの情報については、「診断コンテキストを管理するための DyeInjection モニタのコンフィグレーション」を参照してください。

このプログラムをコンパイルして実行するには、次の手順に従います。

  1. DiagnosticContextExample.java サンプル (コード リスト 14-2) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。

    javac -d . DiagnosticContextExample.java
    

    これにより、/weblogic/diagnostics/examples ディレクトリが作成され、その中に DiagnosticContextExample.class が格納されます。

  2. プログラムを実行します。コマンドの構文は次のようになります。

    java weblogic.diagnostics.examples.DiagnosticContextExample
    

    サンプル出力は次のようになります。

    # java weblogic.diagnostics.examples.DiagnosticContextExample
    ContextId=5b7898f93bf010ce:40305614:1048582efd4:-8000-0000000000000001
    isDyedWith(DYE_0)=false
    isDyedWith(DYE_0)=true
    

コード リスト 14-1 サンプル DiagnosticContextExample.java

package weblogic.diagnostics.examples;
import weblogic.diagnostics.context.DiagnosticContextHelper;
public class DiagnosticContextExample { 
  public static void main(String args[]) throws Exception {
    System.out.println("ContextId=" +
        DiagnosticContextHelper.getContextId());
    System.out.println("isDyedWith(DYE_0)=" + 
       DiagnosticContextHelper.isDyedWith(DiagnosticContextHelper.DYE_0));
    DiagnosticContextHelper.setDye(DiagnosticContextHelper.DYE_0, true);
    System.out.println("isDyedWith(DYE_0)=" + 
         DiagnosticContextHelper.isDyedWith(DiagnosticContextHelper.DYE_0));
  }
}

サンプル : HarvesterMonitor.java

HarvesterMonitor プログラムでは、ハーベスタ JMX 通知を使用して、収集サイクルの発生を識別します。次に、アクセサを使用して新しい値を取得します。すべてのアクセスは、JMX を使用して実行します。この節では、HarvesterMonitor.java のコードを示す前に、通知リスナについて説明します。

ハーベスタ コンポーネントの詳細については、「メトリック収集用のハーベスタのコンフィグレーション」を参照してください。

通知リスナ

通知リスナでは、特定の転送媒体に対応する実装が用意されています。たとえば、SMTP 通知リスナでは、メール サーバとの SMTP 接続を確立し、その SMTP 通知リスナが受信する通知インスタンスで電子メールをトリガするメカニズムを利用できます。JMX、SNMP、JMS などの種類のリスナでも、それぞれに対応した実装があります。


注意 :

SMTP、JMX、SNMP、または JMS 以外の転送媒体を使用して、WebLogic 診断フレームワークで生成されたイベントを伝播するプラグインを開発できます。1 つの方法としては、JMX NotificationListener インタフェースを使用してオブジェクトを実装し、選択した転送媒体の必要条件に従って通知を伝播します。

表 14-2 に、WebLogic Server で利用可能な各通知リスナの種類、およびその種類に対応するコンフィグレーションを示します。

14-2 通知リスナの種類

通知媒体 説明 必要なコンフィグレーション パラメータ

JMS

JMS Message キューまたはトピックを介して伝播。

必須 : 送り先の JNDI 名。

省略可能 : 接続ファクトリの JNDI 名 (ない場合は、デフォルト JMS 接続ファクトリを使用)。

JMX

標準 JMX 通知を介して伝播。

必須パラメータはなし。イベントのポストにはあらかじめ定義されたシングルトンを使用。

SMTP

通常の電子メールを介して伝播。

必須 : MailSession JNDI 名と Destination の電子メール。

省略可能 : 電子メールの件名と本文 (指定しない場合は、デフォルトを使用)

SNMP

SNMP トラップおよび WebLogic Server SNMP エージェントを介して伝播。

必須パラメータはなし。ただし、WebLogic SNMP エージェントで SNMPTrapDestination MBean を定義する必要がある。


デフォルトでは、監視ルールから発動したすべての通知は、コンフィグレーションされた媒体を介して発動されるとともに、サーバ ログ ファイルに格納されます。

HarvesterMonitor.java

HarvesterMonitor プログラムをコンパイルして実行するには、次の手順に従います。

  1. HarvesterMonitor.java サンプル (コード リスト 14-2) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。

    javac -d . HarvesterMonitor.java
    

    これにより、/weblogic/diagnostics/examples ディレクトリが作成され、その中に HarvesterMonitor.class および HarvesterMonitor$HarvestCycleHandler.class が格納されます。

  2. モニタを開始します。コマンドの構文は次のようになります。

    java HarvesterMonitor <server> <port> <uname> <pw> [<types>]
    

    WebLogic Server インスタンスにアクセスし、サーバの名前、ポート番号、管理者のログイン名、および管理者のパスワードを調べる必要があります。

    収集される型名のリストを指定することもできます。指定した場合、プログラムを実行するとそれらの型の値のみが表示されます。ただし、選択したそれぞれの型について収集した値がすべて表示されます。表示される値を制約する方法は提供されていません。

    収集が明示的にコンフィグレーションされた値のみが表示されます。監視ルールをサポートするためだけに収集された値 (暗黙的な値) は表示されません。

    次のコマンドでは、CLASSPATH 変数に「.」を含める必要があります。また、このコマンドは、プログラムをコンパイルしたディレクトリから実行する必要があります。このコマンドを実行すると、ポート 7001、ユーザ weblogic、パスワード weblogic で myserver サーバに接続されます。

    java weblogic.diagnostics.examples.HarvesterMonitor myserver 7001
      weblogic weblogic
    

    HarvesterMonitor からの出力のサンプルについては、コード リスト 14-3 を参照してください。

コード リスト 14-2 サンプル : HarvesterMonitor.java

package weblogic.diagnostics.examples;
import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean;
import javax.management.*;
import javax.management.remote.*;
import javax.naming.Context;
import java.util.*;
public class HarvesterMonitor {

  private static String accessorRuntimeMBeanName;
   private static ObjectName accessorRuntimeMBeanObjectName;
  private static String harvRuntimeMBeanName;
   private static ObjectName harvRuntimeMBeanObjectName;
  private static MBeanServerConnection rmbs;
  private static ObjectName getObjectName(String objectNameStr) {
     try { return new ObjectName(getCanonicalName(objectNameStr)); }
     catch (RuntimeException x) { throw x; }
     catch (Exception x) { x.printStackTrace(); throw new
                                RuntimeException(x); }
  }
  private static String getCanonicalName(String objectNameStr) {
     try { return new ObjectName(objectNameStr).getCanonicalName(); }
     catch (RuntimeException x) { throw x; }
     catch (Exception x) { x.printStackTrace(); throw new
                                 RuntimeException(x); }
  }
  private static String serverName;
   private static int port;
   private static String userName;
   private static String password;
  private static ArrayList typesToMonitor = null;
  public static void main(String[] args) throws Exception {
    if (args.length < 4) {
        System.out.println(
             "Usage: java weblogic.diagnostics.harvester.HarvesterMonitor " +
             "<serverName> <port> <userName> <password> [<types>]" +
              weblogic.utils.PlatformConstants.EOL +
              "  where <types> (optional) is a comma-separated list " +
              "of types to monitor.");
        System.exit(1);
    }
    serverName = args[0];
     port = Integer.parseInt(args[1]);
     userName = args[2];
     password = args[3];
    accessorRuntimeMBeanName = getCanonicalName(
         "com.bea:ServerRuntime=" + serverName +
          ",Name=HarvestedDataArchive,Type=WLDFDataAccessRuntime" +
          ",WLDFAccessRuntime=Accessor,WLDFRuntime=WLDFRuntime");
    accessorRuntimeMBeanObjectName = 
          getObjectName(accessorRuntimeMBeanName);
    harvRuntimeMBeanName = getCanonicalName(
        "com.bea:ServerRuntime=" + serverName +
        ",Name=WLDFHarvesterRuntime,Type=WLDFHarvesterRuntime" +
        ",WLDFRuntime=WLDFRuntime");
    harvRuntimeMBeanObjectName = getObjectName(harvRuntimeMBeanName);
    if (args.length > 4) {
      String typesStr = args[4];
      typesToMonitor = new ArrayList();
      int index;
      while ((index = typesStr.indexOf(",")) > 0) {
        String typeName = typesStr.substring(0,index).trim();
        typesToMonitor.add(typeName);
        typesStr = typesStr.substring(index+1);
      }
      typesToMonitor.add(typesStr.trim());
    }
    rmbs = getRuntimeMBeanServerConnection();
    new HarvesterMonitor().new HarvestCycleHandler();
    while(true) {Thread.sleep(100000);}
  }
  static protected String JNDI = "/jndi/";
  static public MBeanServerConnection getRuntimeMBeanServerConnection()
      throws Exception {
    JMXServiceURL serviceURL;
    serviceURL =
        new JMXServiceURL("t3",
        "localhost",
        port,
        JNDI + RuntimeServiceMBean.MBEANSERVER_JNDI_NAME);
    System.out.println("ServerName=" + serverName);
    System.out.println("URL=" + serviceURL);
    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");
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h);
    return connector.getMBeanServerConnection();
  }
  class HarvestCycleHandler implements NotificationListener {
    // used to track harvest cycles
    private int timestampIndex;
    private int domainIndex;
    private int serverIndex;
    private int typeIndex;
    private int instNameIndex;
    private int attrNameIndex;
    private int attrTypeIndex;
    private int attrValueIndex; 
    long lastSampleTime = System.currentTimeMillis();
    HarvestCycleHandler() throws Exception{
      System.out.println("Harvester monitor started...");
      try {
        setUpRecordIndices();
        rmbs.addNotificationListener(harvRuntimeMBeanObjectName, 
                                     this, null, null);
      }
      catch (javax.management.InstanceNotFoundException x) {
        System.out.println("Cannot find JMX data. " +
                           "Is the server name correct?");
        System.exit(1);
      }
    }
    private void setUpRecordIndices() throws Exception {
      Map columnIndexMap = (Map)rmbs.getAttribute(
          accessorRuntimeMBeanObjectName, "ColumnIndexMap");
      timestampIndex =       ((Integer)columnIndexMap.get("TIMESTAMP")).intValue();
      domainIndex = 
            ((Integer)columnIndexMap.get("DOMAIN")).intValue();
      serverIndex = 
            ((Integer)columnIndexMap.get("SERVER")).intValue();
      typeIndex = 
            ((Integer)columnIndexMap.get("TYPE")).intValue();
      instNameIndex = 
            ((Integer)columnIndexMap.get("NAME")).intValue();
      attrNameIndex = 
            ((Integer)columnIndexMap.get("ATTRNAME")).intValue();
      attrTypeIndex = 
            ((Integer)columnIndexMap.get("ATTRTYPE")).intValue();
      attrValueIndex =       ((Integer)columnIndexMap.get("ATTRVALUE")).intValue();
    }
    public synchronized void handleNotification(Notification notification,
                                                Object handback) {
        System.out.println("\n------------------------------------------");
      long thisSampleTime = System.currentTimeMillis()+1;
      try {
        String lastTypeName = null;
        String lastInstName = null;
        String cursor = (String)rmbs.invoke(accessorRuntimeMBeanObjectName,
                        "openCursor",
                        new Object[]{new Long(lastSampleTime),
                        new Long(thisSampleTime), null},
                        new String[]{ "java.lang.Long",
                        "java.lang.Long", "java.lang.String" } );
        while (((Boolean)rmbs.invoke(accessorRuntimeMBeanObjectName,
                        "hasMoreData",
                        new Object[]{cursor},
                        new String[]{"java.lang.String"})).booleanValue()) {
          Object[] os = (Object[])rmbs.invoke(accessorRuntimeMBeanObjectName,
                        "fetch",
                        new Object[]{cursor},
                        new String[]{"java.lang.String"});
          for (int i = 0; i < os.length; i++) {
            Object[] values = (Object[])os[i];
            String typeName = (String)values[typeIndex];
            String instName = (String)values[instNameIndex];
            String attrName = (String)values[attrNameIndex];
            if (!typeName.equals(lastTypeName)) {
              if (typesToMonitor != null &&
                  !typesToMonitor.contains(typeName)) continue;
              System.out.println("\nType " + typeName);
              lastTypeName = typeName;
            }
            if (!instName.equals(lastInstName)) {
              System.out.println("\n Instance " + instName);
              lastInstName = instName;
            }
            Object attrValue = values[attrValueIndex];
            System.out.println("  - " + attrName + "=" + attrValue);
          }
        }
        lastSampleTime = thisSampleTime;
      }
      catch (Exception e) {e.printStackTrace();}
    }
  }
}

コード リスト 14-3 に、HarvesterMonitor プログラムからの出力のサンプルを示します。

コード リスト 14-3 HarvesterMonitor からのサンプル出力

ServerName=myserver
URL=service:jmx:t3://localhost:7001/jndi/weblogic.management.mbeanservers.runtime
Harvester monitor started...
------------------------------------------------------
Type weblogic.management.runtime.WLDFHarvesterRuntimeMBean
Instance com.bea:Name=WLDFHarvesterRuntime,ServerRuntime=myserver,Type=WLDFHarvesterRuntime,WLDFRuntime=WLDFRuntime
    - TotalSamplingTime=202048863
    - CurrentSnapshotElapsedTime=1839619
Type weblogic.management.runtime.ServerRuntimeMBean
  Instance com.bea:Name=myserver,Type=ServerRuntime
    - RestartRequired=false
    - ListenPortEnabled=true
    - ActivationTime=1118319317071
    - ServerStartupTime=40671
    - ServerClasspath= [deleted long classpath listing]
    - CurrentMachine=
    - SocketsOpenedTotalCount=1
    - State=RUNNING
    - RestartsTotalCount=0
    - AdminServer=true
    - AdminServerListenPort=7001
    - ClusterMaster=false
    - StateVal=2
    - CurrentDirectory=C:\testdomain\.
    - AdminServerHost=10.40.8.123
    - OpenSocketsCurrentCount=1
    - ShuttingDown=false
    - SSLListenPortEnabled=false
    - AdministrationPortEnabled=false
    - AdminServerListenPortSecure=false
    - Registered=true

サンプル : JMXAccessorExample.java

次のサンプルでは、JMX を使用してログ エントリを標準出力に出力します。すべてのアクセスは、JMX を使用して実行します。(アクセサ コンポーネントの詳細については、「データ アクセサを使用した診断データへのアクセス」を参照)。

このプログラムをコンパイルして実行するには、次の手順に従います。

  1. JMXAccessorExample.java サンプル (コード リスト 14-4) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。

    javac -d . JMXAccessorExample.java
    

    これにより、/weblogic/diagnostics/examples ディレクトリが作成され、その中に JMXAccessorExample.class が格納されます。

  2. プログラムを実行します。コマンドの構文は次のようになります。

    java weblogic.diagnostics.example.JMXAccessor <logicalName> <query>
    

    WebLogic Server インスタンスにアクセスし、サーバの名前、ポート番号、管理者のログイン名、および管理者のパスワードを調べる必要があります。

    logicalName はログの名前です。有効な名前は、HarvestedDataArchive、EventsDataArchive、ServerLog、DomainLog、HTTPAccessLog、ServletAccessorHelper.WEBAPP_LOG、RAUtil.CONNECTOR_LOG、JMSMessageLog、および CUSTOM です。

    クエリは、「WLDF クエリ言語」で説明する構文を使用して作成されます。JMXAccessorExample プログラムでは、空の query (空の二重引用符のペア、"") を指定すると、ログ内のすべてのエントリが返されます。

    次のコマンドでは、CLASSPATH 変数に「.」を含める必要があります。また、このコマンドは、プログラムをコンパイルしたディレクトリから実行する必要があります。プログラムでは、IIOP (Internet Inter-ORB Protocol) プロトコルを使用して、ユーザ weblogic、パスワード weblogic でポート 7001 に接続し、ServerLog ログ内のすべてのエントリを標準出力に出力します。

    java weblogic.diagnostics.examples.JMXAccessorExample ServerLog ""
    

    このサンプルは、適切なユーザ名とパスワードを使用するように変更できます。

コード リスト 14-4 JMXAccessorExample.java

package weblogic.diagnostics.examples;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;
import java.util.Iterator;
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 JMXAccessorExample {
  private static final String JNDI = "/jndi/";
  public static void main(String[] args) {
    try {
      if (args.length != 2) {
        System.err.println("Incorrect invocation. Correct usage is:\n" +
          "java weblogic.diagnostics.examples.JMXAccessorExample " +
          "<logicalName> <query>");
        System.exit(1);
      }
      String logicalName = args[0];
      String query = args[1];   
      MBeanServerConnection mbeanServerConnection =
        lookupMBeanServerConnection();
      ObjectName service = new
          ObjectName(weblogic.management.mbeanservers.runtime.RuntimeServiceMBean.OBJECT_NAME);
      ObjectName serverRuntime =
        (ObjectName) mbeanServerConnection.getAttribute(service,
         "ServerRuntime");
      ObjectName wldfRuntime =
        (ObjectName) mbeanServerConnection.getAttribute(serverRuntime,
         "WLDFRuntime");
      ObjectName wldfAccessRuntime =
        (ObjectName) mbeanServerConnection.getAttribute(wldfRuntime,
         "WLDFAccessRuntime");
      ObjectName wldfDataAccessRuntime =
        (ObjectName) mbeanServerConnection.invoke(wldfAccessRuntime,
         "lookupWLDFDataAccessRuntime", new Object[] {logicalName}, 
          new String[] {"java.lang.String"});
      String cursor =
         (String) mbeanServerConnection.invoke(wldfDataAccessRuntime,
          "openCursor", new Object[] {query}, 
          new String[] {"java.lang.String"});
      int fetchedCount = 0;
      do {
        Object[] rows =
         (Object[]) mbeanServerConnection.invoke(wldfDataAccessRuntime,
          "fetch", new Object[] {cursor}, 
          new String[] {"java.lang.String"});
        fetchedCount = rows.length;
        for (int i=0; i<rows.length; i++) {
         StringBuffer sb = new StringBuffer();
          Object[] cols = (Object[]) rows[i];
          for (int j=0; j<cols.length; j++) {
            sb.append("Index " + j + "=" + cols[j].toString() + " ");
          }
          System.out.println("Found row = " + sb.toString());
        }
      } while (fetchedCount > 0);
      mbeanServerConnection.invoke(wldfDataAccessRuntime,
          "closeCursor", new Object[] {cursor},
          new String[] {"java.lang.String"});
      } catch(Throwable th) {
      th.printStackTrace();
      System.exit(1);
    }
  }
   private static MBeanServerConnection lookupMBeanServerConnection ()
          throws Exception {
    // JMX サービス URL を作成する
    JMXServiceURL serviceURL;
    serviceURL = new JMXServiceURL("iiop", "localhost", 7001, 
        JNDI + "weblogic.management.mbeanservers.runtime");
    // ユーザ、パスワード、WebLogic プロバイダ パッケージを指定する
    Hashtable h = new Hashtable();
    h.put(Context.SECURITY_PRINCIPAL,"weblogic");
    h.put(Context.SECURITY_CREDENTIALS,"weblogic");
    h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
          "weblogic.management.remote");
    // JMX コネクタを取得する 
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h);
    // MBean サーバの接続クラスを返す
    return connector.getMBeanServerConnection();
  } // lookupMBeanServerConnection の終了
}