ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
11g リリース1(10.3.6)
B60994-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストヘ移動
製品
目次へ移動
目次

前
 
次
 

16 WLDFのプログラム的な構成と使用

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

次の項では、WLDFのプログラム的な構成について説明します。

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

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

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

構成は主に管理タスクであり、管理コンソールまたはWLSTスクリプトを使用して行います。システム・レベル(サーバーおよびクラスタ)やアプリケーション・レベルでデプロイ可能な記述子モジュールとXML構成ファイルは、診断リソースを構成するための主なメソッドです。(WLDFリソースの構成の詳細は、第4章「WLDF構成について」を参照してください。)

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

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

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

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

図16-1 WLDF 構成MBean、ランタイムMBean、およびシステム・モジュールBean

図16-1の説明が続きます
「図16-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およびパッケージを使用し、実行中のサーバーの情報にアクセスして変更します。

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

サンプル: DiagnosticContextExample.java

次のサンプルでは、weblogic.diagnostics.contextパッケージのDiagnosticContextHelperクラスを使用して、DYE_0フラグの値を取得および設定します。(診断コンテキストの詳細は、第12章「診断コンテキストを管理するためのDyeInjectionモニターの構成」を参照してください。)

このプログラムをコンパイルして実行するには:

  1. DiagnosticContextExample.javaサンプル(例16-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
    

例16-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のコードを示す前に、通知リスナーについて説明します。

ハーベスタ・コンポーネントの詳細は、第7章「メトリック収集用のハーベスタの構成」を参照してください。

通知リスナー

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


注意:

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

表16-2に、WebLogic Serverで利用可能な各通知リスナーの種類、およびその種類に対応する構成を示します。

表16-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サンプル(例16-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からの出力のサンプルについては、例16-3を参照してください。

例16-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();}
    }
  }
}

例16-3に、HarvesterMonitorプログラムからの出力のサンプルを示します。

例16-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を使用して実行します。(アクセサ・コンポーネントの詳細は、第13章「データ・アクセサを使用した診断データへのアクセス」を参照してください。)

このプログラムをコンパイルして実行するには:

  1. JMXAccessorExample.javaの例(例16-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です。

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

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

    java weblogic.diagnostics.examples.JMXAccessorExample ServerLog ""
    

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

例16-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 {
    // construct JMX service URL
    JMXServiceURL serviceURL;
    serviceURL = new JMXServiceURL("iiop", "localhost", 7001, 
        JNDI + "weblogic.management.mbeanservers.runtime");
    // Specify the user, password, and WebLogic provider package
    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");
    // Get jmx connector 
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h);
    // return MBean server connection class
    return connector.getMBeanServerConnection();
  } // End - lookupMBeanServerConnection
}