Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用 12cリリース1(12.1.1) B65916-02 |
|
前 |
次 |
この章では、JMX APIとWebLogic Scripting Tool(WLST)を使用してWebLogic診断フレームワーク(WLDF)をプログラム的に有効化し、構成して、さらにモニターする方法について説明します。この方法は、WebLogic Server管理コンソールでこれらのタスクを実行するかわりに使用されます。
この章の内容は以下のとおりです。
アプリケーションの開発とデプロイ、およびWLSTの使い方については、次の項での説明に加え、次のマニュアルも参照してください。
Oracle WebLogic Serverアプリケーションの開発
Oracle WebLogic Server JMXによる管理の容易なアプリケーションの開発
Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発
Oracle WebLogic Serverへのアプリケーションのデプロイ
Oracle WebLogic Scripting Tool
通常、診断データは、以下のプロセスでWLDFコンポーネントによって生成および取得されます。
ハーベスタ、インストゥルメンテーション、イメージ・キャプチャ、および監視および通知の各コンポーネントのWLDF XML記述子ファイルの設定によって、サーバーの実行中に生成される診断データの種類と量が決まります。
診断コンテキストとインストゥルメンテーションの設定によって、診断データがシステム内を流れる過程でフィルタ処理およびモニターされます。データが収集され、アクションがトリガーされ、イベントが生成され、構成された通知が送信されます。
アーカイブ・コンポーネントによってデータが格納されます。
アクセサ・コンポーネントによってデータが取得されます。
構成は主に管理タスクであり、管理コンソールまたはWLSTスクリプトを使用して行います。システム・レベル(サーバーおよびクラスタ)やアプリケーション・レベルでデプロイ可能な記述子モジュールとXML構成ファイルは、診断リソースを構成するための主なメソッドです。(WLDFリソースの構成の詳細は、第4章「WLDF構成について」を参照してください。)
アクセサ・コンポーネントによる出力の取得は、管理タスクになる場合と、プログラム的なタスクになる場合があります。
管理コンソールまたはWLSTを使ってWLDFリソースを作成すると、WebLogic Serverは各リソースについてMBean(マネージドBean)を作成します。JMXまたはWLSTを使用してこれらのMBeanにアクセスできます。weblogic.WLSTはJMXクライアントであるため、WLSTを使用して実行できるすべてのタスクは、JMXを使用してプログラム的に実行することもできます。
表16-1には、WLDFおよびそのコンポーネントに関係するBeanとパッケージを示します。図16-1では、Beanをタイプ別にグループ化しています。
表16-1 BeanおよびパッケージへのWLDFコンポーネントのマッピング
コンポーネント | Bean /パッケージ |
---|---|
WLDF |
|
診断イメージ |
|
インストゥルメンテーション |
|
診断コンテキスト |
パッケージ: weblogic.diagnostics.context |
ハーベスタ |
|
監視および通知 |
WLDFWatchJMXNotificationRuntimeMBean WLDFWatchNotificationRuntimeMBean パッケージ: weblogic.diagnostics.watch |
アーカイブ |
|
アクセサ |
WebLogic診断フレームワークを使用すると、次のタスクをプログラムで実行できます。
診断記述子ファイルを作成および変更して、WLDFハーベスタ、インストゥルメンテーション、および監視および通知コンポーネントをサーバー・レベルで構成します。
JMXを使用して、WLDFの操作と属性にアクセスします。
JMXを使用して、収集可能なデータを格納するカスタムMBeanを作成します。次に、ハーベスタを構成してデータを収集したり、監視および通知を構成して値をモニターしたりできます。
次のタスクを実行するJavaプログラムを作成します。
JMXリスナーによる通知のキャプチャ。
JMSによる通知のキャプチャ。
アクセサによるアーカイブされたデータの取得(アクセサは、他のコンポーネントと同様にJMXとして表面化されており、WLSTやJMXプログラミングによって診断データを取り出すことができます)。
構成APIと実行時APIは、WLDFを構成およびモニターします。構成APIと実行時APIは、双方ともMBeanとして公開されます。
構成MBeanとシステム・モジュールBeanは、WLDFリソースを作成および構成し、その実行時の動作を決定します。
ランタイムMBeanは、様々なコンポーネントの実行時状態および定義された処理をモニターします。
構成APIと実行時APIを使用すると、データ収集を構成、アクティブ化、非アクティブ化したり、監視、通知、アラーム、診断イメージ・キャプチャを構成したり、データにアクセスしたりできます。
構成APIは、次のWLDFコンポーネントの構成に使用するインタフェースを定義します。
データ・コレクタ:構成APIを使用すると、インストゥルメンテーション、収集、イメージ・キャプチャを構成および制御できます。
インストゥルメンテーション・コンポーネントでは、サーバー・レベルのインストゥルメンテーションおよびインストゥルメンテーション・モニターを有効化、無効化、作成、および破棄できます。
注意: 構成APIでは、アプリケーション・レベルのインストゥルメンテーションの構成をサポートしていません。ただし、Java Specification Request (JSR) 88 APIを使用している場合、アプリケーション・レベルのインストゥルメンテーションに対する構成の変更が影響を受ける可能性があります。 |
ハーベスタ・コンポーネントでは、収集する型を追加および削除したり、その型のどの属性およびインスタンスを収集するかを指定したり、ハーベスタのサンプル期間を設定したりできます。
診断イメージ・キャプチャ・コンポーネントでは、イメージ・キャプチャを格納するディレクトリの名前とパス、イベント・イメージ・キャプチャの間隔(最近アーカイブされたイベントが診断イメージにキャプチャされる時間間隔)を設定できます。
監視および通知:構成APIを使用すると、監視および通知の有効化、無効化、作成および破棄を行えます。また、構成APIを使用すると、次のことが可能になります。
ルールの種類、監視ルール式、監視の重大度の設定
通知に対するアラームの種類およびアラーム・リセット期間の設定
診断イメージ・キャプチャをトリガーするための監視の構成
監視への通知の追加、および監視からの通知の削除
アーカイブ:アーカイブの種類およびアーカイブ・ディレクトリを設定できます。
実行時APIは、WLDFコンポーネントの実行時の状態をモニターするためのインタフェースを定義します。これらのAPIのインスタンスは、個々の管理対象サーバーのインスタンス上でインスタンス化されます。実行時APIは、ランタイムMBeanとして定義されているので、JMXクライアントが簡単にアクセスできます。
実行時APIは、個々のWLDFコンポーネントの他のすべての実行時インタフェースをカプセル化します。これらのAPIは、weblogic.management.runtimeパッケージに入っています。
実行時APIを使用すると、次のWLDFコンポーネントをモニターできます。
データ・コレクタ: 実行時APIを使用すると、インストゥルメンテーション、ハーベスタ、イメージ・キャプチャの各コンポーネントをモニターできます。
インストゥルメンテーション・コンポーネントでは、ジョインポイント数の統計、インストゥルメンテーション・モニターで検査されたクラスの数、変更されたクラスの数、およびインストゥルメンテーション・モニターでクラスの検査にかかった時間をモニターできます。
ハーベスタ・コンポーネントでは、収集可能な型のセット、収集可能な属性、および収集可能なインスタンス(つまり、特定の型で現在収集可能なインスタンス)を問い合わせることができます。また、収集用に現在構成されている型、属性、およびインスタンスを問い合わせることもできます。サンプリング間隔、および収集プロセスに関する様々な実行時統計も利用可能です。
イメージ・キャプチャ・コンポーネントでは、診断イメージの出力先およびロックアウト期間を指定して、イメージ・キャプチャを開始できます。
監視および通知: 実行時APIを使用すると、監視および通知およびアーカイブの各コンポーネントをモニターできます。
監視および通知コンポーネントでは、監視アラームを設定したり、アラーム、イベント、ログ・レコード、収集されたメトリックの解析に関する情報など、監視ルールの評価やトリガーされた監視に関する統計をモニターしたりできます。
アーカイブ:ファイル名、アーカイブの統計など、アーカイブに関する情報をモニターできます。
データ・アクセサ: 実行時APIを使用すると、別のアーカイブに保持されている診断データを取り出すことができます。また、実行時APIでは、基底のアーカイブからデータを検索する問合せ式を指定できるので、データのフィルタ処理も利用できます。列型のマップ(診断データの対応する型名に列名を関連付けたマップ)、データ・レコード数とタイムスタンプに関する統計、カーソル(クライアントがデータ・レコードを取得するためのカーソル)に関する情報をモニターできます。
以下の2つのパッケージが用意されています。
weblogic.diagnostics.contextには以下が含まれます。
DiagnosticContextConstants、WebLogic診断システムでサポートされる仕分けフラグの索引を定義します。
DiagnosticContextHelper、アプリケーションから診断コンテキストへの限定的なアクセスを提供します。
weblogic.diagnostics.watchには以下が含まれます。
JMXWatchNotification、通知に関する追加情報を含む拡張JMX通知オブジェクトです。この情報は、getExtendedInfoメソッドから返される参照されたWatchNotificationオブジェクトに保持されます。
WatchNotification、監視ルールの通知を定義します。
次のサンプルでは、WLDF Beansおよびパッケージを使用し、実行中のサーバーの情報にアクセスして変更します。
また、付録D「WebLogic Scripting Toolのサンプル」のWLSTおよびJMXのサンプルも参照してください。
次のサンプルでは、weblogic.diagnostics.contextパッケージのDiagnosticContextHelperクラスを使用して、DYE_0フラグの値を取得および設定します。(診断コンテキストの詳細は、第12章「診断コンテキストを管理するためのDyeInjectionモニターの構成」を参照してください。)
このプログラムをコンパイルして実行するには:
DiagnosticContextExample.javaサンプル(例16-1)をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
javac -d . DiagnosticContextExample.java
これにより、/weblogic/diagnostics/examplesディレクトリが作成され、その中にDiagnosticContextExample.classが格納されます。
プログラムを実行します。コマンドの構文は次のようになります。
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プログラムでは、ハーベスタ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プログラムをコンパイルして実行するには:
HarvesterMonitor.javaサンプル(例16-2)をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
javac -d . HarvesterMonitor.java
これにより、/weblogic/diagnostics/examplesディレクトリが作成され、その中にHarvesterMonitor.classおよびHarvesterMonitor$HarvestCycleHandler.classが格納されます。
モニターを開始します。コマンドの構文は次のようになります。
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
次のサンプルでは、JMXを使用してログ・エントリを標準出力します。すべてのアクセスは、JMXを使用して実行します。(アクセサ・コンポーネントの詳細は、第13章「データ・アクセサを使用した診断データへのアクセス」を参照してください。)
このプログラムをコンパイルして実行するには:
JMXAccessorExample.javaの例(例16-4)をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
javac -d . JMXAccessorExample.java
これにより、/weblogic/diagnostics/examplesディレクトリが作成され、その中にJMXAccessorExample.classが格納されます。
プログラムを実行します。コマンドの構文は次のようになります。
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プログラムでは、空の問合せ(空の二重引用符のペア、"")を指定すると、ログ内のすべてのエントリが返されます。
次のコマンドでは、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 }