Oracle® Fusion Middleware

Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発

12c (12.2.1)

E70011-02(原本部品番号:E55225-02)

2016年2月

WebLogic Serverリソースのモニターと変更を行うJMXクライアントを作成する方法について説明している開発者用ドキュメント。

Oracle Fusion Middleware Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発, 12c (12.2.1)

E70011-02

Copyright © 2007, 2016, Oracle and/or its affiliatesAll rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- ドキュメントのアクセシビリティについて

- 表記規則

1 概要とロードマップ

- ドキュメントのスコープと対象読者

- このドキュメントの手引き

- 関連ドキュメント

- このリリースでの新機能と変更された機能

2 WebLogic Server MBeanの理解

- WebLogic Serverドメインの基本構成

- モニター用または構成用に分けられるMBeanタイプ

- WebLogic Server MBeanのライフサイクル

- WebLogic Server MBeanのデータ・モデル

- 包含関係と参照関係

- 包含関係

- 参照関係

- WebLogic Server MBeanのオブジェクト名

- MBeanServerInvocationHandler

- MBeanサーバー

- MBeanサーバーへの接続

- MBeanサーバーへのローカル接続

- MBeanサーバーへのリモート接続

- プラットフォームMBeanサーバーの使用

- サービスMBean

- WebLogic Server MBeanのセキュリティ

- 一部の属性および操作用のその他のセキュリティ・リソース

3 WebLogic ServerサブシステムMBeanの概要

- ドメインおよびサーバー・ロギングの構成

- JMSサーバーおよびJMSシステム・モジュールの構成

- JDBCリソースの構成

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

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

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

- 例: ドメイン・ランタイムMBeanサーバーへの接続

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

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

- ランタイムMBeanサーバーへのローカル接続の作成

- ドメイン・ランタイムMBeanサーバーへのローカル接続の作成

- MBean階層内の移動

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

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

5 JMXを使用したドメインの構成の管理

- MBean属性の編集:主な手順

- 編集セッションの開始

- MBean属性の変更または新しいMBean作成

- 保留中の構成ファイルへの変更の保存

- 保存した変更のアクティブ化

- 例:管理ポートの変更

- 編集操作によってスローされる例外の型

- 変更の表示と取消し

- 保存されていない変更の表示

- アクティブ化されていない変更の表示

- 現在のアクティブ化タスクにある変更の表示

- 変更の取消し

- 変更のアクティブ化の追跡

- 現在のアクティブ化タスクのステータスの表示

- メモリーに格納されているすべてのアクティブ化タスクの表示

- 完了したアクティブ化タスクのメモリーからのパージ

- ロックの管理

- ベスト・プラクティス:編集と例外処理の推奨パターン

- 暗号化された値の設定と取得

- 暗号化された属性の値の設定(推奨技術)

- 暗号化された属性の値の設定(互換性のある技術)

- 暗号化された値のバックアップ

6 JMXを使用したセキュリティ・レルムの管理

- セキュリティMBeanの階層の理解

- 基本プロバイダ・タイプと混合インタフェース

- セキュリティMBean

- セキュリティ・レルムを管理するMBeanサーバーの選択

- 既存のセキュリティ・プロバイダの操作

- 使用可能なサービスの検索

- 例: レルムへのユーザーの追加

- レルム構成の変更

7 通知とモニターMBeanの使い方

- ベスト・プラクティス:直接的なリスニングとモニター

- ベスト・プラクティス: WebLogic Serverイベントのリスニング

- ベスト・プラクティス: WebLogic Serverランタイム統計のリスニングまたはモニター

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

- 通知リスナーの作成

- リモートJVMからのリスニング

- ベスト・プラクティス: 通知リスナーの作成

- 通知フィルタの構成

- カスタム・フィルタの作成

- 通知リスナーとフィルタの登録

- WebLogic Serverにリスナーのパッケージ化およびデプロイ化

- 例:構成MBeanの登録のリスニング

- モニターMBeanを使用した変更の観察:主な手順

- モニターMBeanのタイプと通知の型の選択

- エラーとMonitorNotificationのTypeプロパティ

- モニターMBean用の通知リスナーの作成

- モニターとリスナーの登録

- 例: CounterMonitorMBeanとそのリスナーの登録

8 WebLogic Server JMXサービスの構成

- ドメインで使用可能なJMXサービスの決定

- 例: WebLogic Scripting Toolを使用してドメインを読取り専用にする方法

はじめに

ここでは、このガイド『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』で使用されるドキュメントのアクセシビリティ機能および表記規則について説明します。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

サポートをご購入のOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

表記規則

このドキュメントでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

斜体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 概要とロードマップ

このドキュメントでは、WebLogic Serverリソースをモニターおよび変更するJMXクライアントの作成について説明します。サード・パーティ製の管理システムをWebLogic Server管理システムと統合するために、WebLogic Serverには標準ベースのインタフェースが用意されています。これらのインタフェースは、Java Management Extensions (JMX)仕様に完全に準拠しています。ソフトウェア・ベンダーはこれらのインタフェースを使用して、WebLogic Server MBeanをモニターし、WebLogic Serverドメインの構成を変更し、ドメイン内のすべてのサーバー・インスタンスに対するこれらの変更の配布(アクティブ化)をモニターすることができます。JMXクライアントはOracle独自のクラスを使用しなくても、すべてのWebLogic Server管理機能を実行できますが、リモートJMXクライアントではWebLogic Serverプロトコル(T3など)を使用してWebLogic Serverインスタンスに接続することをお薦めします。

以下の項では、このガイド『JMXによるカスタム管理ユーティリティの開発』の内容と構成について説明します。

- ドキュメントのスコープと対象読者

- このドキュメントの手引き

- 関連ドキュメント

- このリリースでの新機能と変更された機能

ドキュメントのスコープと対象読者

このドキュメントは、JMX互換管理システムを開発するソフトウェア・ベンダーを対象としています。また、WebLogic Serverを評価するビジネス・アナリストや、特定のアプリケーションでJMXの使用を考えているシステム設計者にとって便利な情報も掲載されています。

このドキュメントは、Java EEおよび一般的なアプリケーション管理の概念に精通している読者を対象としています。このドキュメントでは、限定的でありながら有用な一連のJMX管理サービスを開発するための実践的な方法を重点的に扱います。JMXをより広範な管理上の問題に適用するには、「関連ドキュメント」に挙げるJMX仕様などのドキュメントを参照してください。

このドキュメントの手引き

- この章「概要とロードマップ」では、このガイドの構成について説明します。

- 第2章「WebLogic Server MBeanの理解」では、WebLogic Server MBeanのモニターと管理に使用するJMXサービスと、WebLogic Server MBeanをまとめるデータ・モデルについて説明します。

- 第3章「WebLogic ServerサブシステムMBeanの概要」では、WebLogic Serverの様々なサブシステムのモニターおよび管理に使用できるMBeanについて説明します。

- 第4章「JMXを使用したWebLogic Server MBeanへのアクセス」では、JMXクライアントからWebLogic Server MBeanにアクセスする手順について説明し、例を示します。

- 第5章「JMXを使用したドメインの構成の管理」では、JMXを使用してWebLogic Serverドメインの構成を管理する手順について説明し、例を示します。

- 第6章「JMXを使用したセキュリティ・レルムの管理」では、セキュリティMBeanの階層、セキュリティ・レルムの管理のためのMBeanサーバーの選択方法、既存のセキュリティ・プロバイダの操作方法と、レルム構成の変更方法について説明します。

- 第7章「通知とモニターMBeanの使い方」では、通知とWebLogic Server MBean属性の変更をリスニングするリスナーの使い方について説明します。

- 第8章「WebLogic Server JMXサービスの構成」では、ドメインで使用できるJMXサービスを指定する方法について説明します。

関連ドキュメント

Oracle Technology Networkには、JMXに関する書籍、ホワイトペーパーおよび詳細情報へのリンクが掲載されたWebサイト(http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html)があります。

WebLogic Serverは、実行されているJDKのJMX実装を活用することでJMX 1.4をサポートします。JMX 1.4の仕様を確認するには、http://docs.oracle.com/javase/7/docs/technotes/guides/jmx/からダウンロードしてください。

JMXリモートAPI 1.0仕様を参照する場合は、(http://jcp.org/aboutJava/communityprocess/final/jsr160/index.html)からダウンロードしてください。

javax.management*パッケージのAPIリファレンスは、http://docs.oracle.com/javase/7/docs/api/overview-summary.htmlで参照できます。

WebLogic Serverアプリケーション用に他のタイプの管理サービスを開発するためのガイドラインについては、以下のドキュメントを参照してください。

- 『Oracle WebLogic ServerにデプロイされたアプリケーションへのWebLogicロギング・サービスの追加』。WebLogicによるログ・メッセージの国際化とローカライゼーションのサポートについて説明し、WebLogic Serverで提供されているテンプレートおよびツールを使用して、ロケール固有のメッセージ・カタログを作成または編集する方法を示しています。

- 『Oracle WebLogic Server診断フレームワークの構成と使用』。システム管理者が、JMX、ロギングなどの管理機能を通じて公開されていないアプリケーション・モニター・データを収集する方法について説明します。

WebLogic Serverアプリケーションを開発およびチューニングするためのガイドラインについては、以下のドキュメントを参照してください。

- 『Oracle WebLogic Serverアプリケーションの開発』。WebLogic Serverアプリケーションの開発ガイドです。

- 『Oracle WebLogic Server JMXによる管理可能アプリケーションの開発』。カスタムMBeanを作成および登録する方法について説明しています。

このリリースでの新機能と変更された機能

このリリースで導入されたWebLogic Serverの新機能の一覧については、『Oracle WebLogic Serverの新機能』 12.2.1を参照してください。

2 WebLogic Server Mbeanの理解

この章では、WebLogic Serverに用意され、WebLogic Serverリソースの構成、モニターおよび管理に使用できるMBeanについて説明します。また、WebLogic ServerでこれらのMBeanの配布と保持を行う方法についても説明します。

この章の内容は以下のとおりです。

- WebLogic Serverドメインの基本構成

- モニター用または構成用に分けられるMBeanタイプ

- WebLogic Server MBeanのライフサイクル

- WebLogic Server MBeanのデータ・モデル

- MBeanサーバー

- WebLogic Server MBeanのセキュリティ

Oracle WebLogic Server MBeanリファレンスでは、すべてのWebLogic Server MBeanについて詳しく説明しています。

WebLogic Serverドメインの基本構成

WebLogic Server管理ドメインは、1つ以上のサーバーと、それらのサーバー上で動作するように構成されたアプリケーションおよびリソースの集合です。各ドメインには、管理サーバーとして指定される特別なサーバー・インスタンスが含まれている必要があります。最も単純なドメインは、管理サーバーとしても、アプリケーションおよびリソースのホストとしても機能する1つのサーバー・インスタンスで構成されます。このドメイン構成は、開発環境でよく使用されます。通常、本番環境用のドメインには複数のサーバー・インスタンス(管理対象サーバー)が含まれ、それぞれを独立して動作させたり、クラスタと呼ばれるグループで動作させたりします。このような環境では、管理サーバーは本番アプリケーションをホストしません。ドメインの詳細は、『Oracle WebLogic Serverドメイン構成の理解』のOracle WebLogic Serverドメインの理解に関する項を参照してください。

モニター用または構成用に分けられるMBeanタイプ

すべてのWebLogic Server MBeanは、そのMBeanがサーバーおよびリソースをモニターするか、または構成するかに基づいて、以下の一般的なタイプのいずれかに分けられます。

- 実行時MBeanには、サーバーとそのリソースの実行時状態に関する情報が含まれます。通常は、サーバーまたはリソースの現在の状態に関するデータのみが含まれ、このデータは永続化されません。サーバー・インスタンスを停止すると、ランタイムMBeanの実行時の統計とメトリックはすべて破棄されます。

- 構成MBean。サーバーおよびリソースの構成に関する情報が含まれます。それらは、ドメインのXML構成ドキュメントに格納されている情報を表します。

- システム・モジュールの構成MBean。JDBCデータ・ソースやJMSトピックなど、システム・レベルで指定されたサービスの構成に関する情報が含まれます。これらのサービスをシステム・レベルで指定する代わりに、モジュールとしてアプリケーションに含めることもできます。これらのアプリケーション・レベルのリソースは、親アプリケーションのライフサイクルおよびスコープを共有します。ただし、WebLogic Serverではアプリケーション・モジュール用のMBeanは提供されていません。『Oracle WebLogic Serverへのアプリケーションのデプロイ』のサポートされるデプロイメント・ユニットに関する項を参照してください。

WebLogic Server MBeanのライフサイクル

ランタイムMBeanのライフサイクルは、そのランタイムMBeanがランタイム・データを公開するリソースのライフサイクルに従います。たとえば、サーバー・インスタンスの起動時に、サーバーはServerRuntimeMBeanをインスタンス化し、そこに現在のランタイム・データを格納します。各リソースは、自身の状態が変化するときに、ランタイムMBean内のデータを更新します。リソースは、停止時にランタイムMBeanを破棄します。

構成MBeanのライフサイクルは、次のようになります。

1. ドメイン内の各サーバーには、ドメインの構成ドキュメント(config.xmlファイルと補助ファイル)の独自のコピーがあります。各サーバーは、起動サイクル時に管理サーバーにアクセスして、そのサーバーが停止していた間に発生したすべての変更を反映するように構成ファイルを更新します。その後、サーバーは、構成ドキュメント内のデータを表す構成MBeanをインスタンス化します(図2-1を参照してください。)

注意:
デフォルトでは、管理対象サーバーは、管理サーバーにアクセスして構成ファイルを更新できなくても起動します。このデフォルトの設定では、ドメイン内で実行される管理対象サーバー間で構成が一致していない状態になるおそれがあります。このデフォルトの変更については、『Oracle WebLogic Serverサーバーの起動と停止の管理』の管理サーバーにアクセスできない場合の管理対象サーバーの起動に関する項を参照してください。

図2-1 管理サーバー上の構成MBeanの初期化

構成MBeanを使用することで、ドメイン内の各サーバー・インスタンスは、ドメインの構成をメモリー内で表現したものを保持できます。

2. ドメインの構成に対する変更を制御するには、JMXクライアントにこれらの構成MBeanに対する読取り専用のアクセス権を付与します。
管理サーバーは、ドメインのconfig/pendingディレクトリでドメインの構成ドキュメントの編集可能なコピーを個別に保持します。また、このような保留中のドキュメントにあるデータを使用し、JMXクライアントを変更できる構成MBeanセットをインスタンス化します。JMXクライアントは、これらの構成MBeanのいずれかを変更すると、保留中の構成ドキュメントにその変更を保存するように管理サーバーに指示します。クライアントはその後、ドメイン内のすべてのサーバー・インスタンスに対して読取り専用の構成ドキュメントと構成MBeanを更新するトランザクション・プロセスを開始します。

詳細は、『Oracle WebLogic Serverドメイン構成の理解』の構成の変更の管理に関する項を参照してください。

3. 構成MBeanは、それらをホストするサーバー・インスタンスが停止されるときに破棄されます。

WebLogic Server MBeanのデータ・モデル

JMX仕様では、MBeanをまとめるためのモデルを定めていません。ただし、WebLogic Serverドメインの構成は、XMLドキュメント内で指定されるため、WebLogic ServerはMBeanを、XMLドキュメント構造を反映した階層モデルにまとめます。

たとえば、ドメインの構成ドキュメントのルートは<domain>であり、そのルートの下には、<server>、<cluster>などの子要素があります。各ドメインは、<domain>ルート要素を表すDomainMBeanタイプの1つのMBeanを保持しています。DomainMBean内では、JMX属性が、<server>、<cluster>などの子要素を表すMBeanへのアクセスを提供します。

以下の節では、基底のXML構成をモデル化するためにWebLogic Server MBeanで使用されるパターンについて説明します。

- 包含関係と参照関係

- WebLogic Server MBeanのオブジェクト名

包含関係と参照関係

他のMBeanへのアクセスを提供するMBean属性は、以下のいずれかのタイプの関係を表現します。

- 包含関係。ドメインの構成ドキュメント内の対応するXML要素間の親子関係を反映します。

- 参照関係。兄弟などの、祖先でも子孫でもない関係を反映します。

包含関係

例2-1のXML抜粋に、<domain>と<server>の間および<domain>と<cluster>の間の包含関係を示します。

例2-1 XML内の包含関係

<domain>
<server>
<name>MyServer</name>
</server>
<cluster>
<name>MyCluster</name>
</cluster>
</domain>

この関係を反映するために、DomainMBeanにはServersおよびClustersという2つの属性があります。Servers属性の値は、ドメインで作成されたすべてのServerMBeanのオブジェクト名の配列(javax.management.ObjectName[])です。Clusters属性の値は、すべてのClusterMBeanのオブジェクト名の配列です。

包含関係のもう一方の側面は、Java beanファクトリ・メソッドの設計パターンに従う一連のMBean操作で表現されます。親MBeanは、包含するMBean (子)ごとにcreateChild操作およびdestroyChild操作を提供します。ChildはMBeanタイプの短縮名です。(短縮名とは、MBean接尾辞の付かない、MBeanの未修飾のタイプ名。たとえば、createServerのように指定します。)

注意:
JMXクライアントは、WebLogic Server MBeanのインスタンスの作成および登録にjavax.management.MBeanServer.create()もregister()も使用できません。WebLogic ServerはMBean実装クラスを公開していないからです。
カスタムMBean (アプリケーションを管理するために作成するMBean)を作成および登録する場合には、独自の実装ファイルにアクセスできれば、標準のMBeanServer.create()メソッドやregister()メソッドを使用できます。カスタムMBeanはWebLogic Serverのデータ・モデルの一部ではなく、ファクトリ・メソッド・モデルには参加しません。

場合によっては、サーバー・インスタンス内の依存関係が原因で、MBeanのファクトリ・メソッドがパブリックではないこともあります。この場合は、親が子のライフサイクルを管理します。たとえば、各ServerMBeanには、そのサーバーのローカル・ログ・ファイルを構成するための唯一の子LogMBeanが必要です。LogMBeanのファクトリ・メソッドはパブリックではなく、ServerMBeanがLogMBeanのライフサイクルを管理します。

包含関係では、親MBeanにlookupChild操作も含まれています。特定のサーバーまたはリソースの作成に使用された、ユーザーが入力した名前が分かっている場合は、親MBeanのlookup操作を使用して、オブジェクト名を取得できます。たとえば、DomainMBeanには、サーバー・インスタンスの作成に使用された名前をパラメータとして取るlookupServers(String name)という操作が含まれています。サーバーにMS1という名前を付けた場合、MS1を含むStringオブジェクトをlookupServersメソッドに渡せば、そのメソッドはMS1のオブジェクト名を返します。

参照関係

例2-2のXML抜粋に、<server>と<cluster>の間の参照関係を示します。

例2-2 XML内の参照関係

<domain>
<server>
<name>MyServer</name>
<cluster>MyCluster</cluster>
</server>
<cluster>
<name>MyCluster</name>
</cluster>
</domain>

サーバーがクラスタに論理的に属しているとき、ドメインの構成ファイル内の<server>要素と<cluster>要素は兄弟です。この関係を反映するために、ServerMBeanにはCluster属性があります。この属性の値は、そのサーバーが属しているClusterMBeanのオブジェクト名(javax.management.ObjectName)です。

参照関係にあるMBeanには、ファクトリ・メソッドは提供されません。

WebLogic Server MBeanのオブジェクト名

すべてのMBeanは、javax.management.ObjectName型のオブジェクト名でMBeanサーバーに登録されなければなりません。WebLogic Serverでは、子MBeanのオブジェクト名にはその親MBeanのオブジェクト名の一部が含まれるという規約に従っています。

注意:
WebLogic Serverの命名規則を理解していれば、オブジェクト名をよく見ることでデータ階層内でのMBeanインスタンスの場所が分かります。ただし、包含属性またはlookup操作を使用してWebLogic Server MBeanのオブジェクト名を取得した場合は、JMXアプリケーションでオブジェクト名を作成したり解析したりする必要はありません。

WebLogic Serverの命名規則では、MBeanオブジェクト名は次のようにエンコードされます。

com.bea:Name=name,Type=type[,TypeOfParentMBean=NameOfParentMBean]
[,TypeOfParentMBean1=NameOfParentMBean1]...

前述のMBeanオブジェクト名規則は次のとおりです。

- com.bea:は、JMXドメイン名。
WebLogic Server MBeanの場合、JMXドメインは常にcom.beaです。アプリケーション用にカスタムMBeanを作成する場合は、独自のJMXドメイン名を付けてください。

- Name=name,Type=type[,TypeOfParentMBean=NameOfParentMBean] [,TypeOfParentMBean1=NameOfParentMBean1]...は、一連のJMXキー・プロパティ。

キー・プロパティの順序は重要ではありませんが、名前の先頭にはcom.bea:を指定する必要があります。

表2-1に、WebLogic ServerがMBeanオブジェクト名にエンコードするキー・プロパティを示します。

表2-1 WebLogic Server MBeanオブジェクト名のキー・プロパティ

キー・プロパティ

指定する対象

Name=name

MBeanが表すリソースを作成したときに指定した文字列。たとえば、サーバーの作成時には、MS1などのサーバー名を指定する必要があります。MS1を表すServerMBeanでは、そのJMXオブジェクト名にName=MS1が使用されます。

MBeanを作成する場合、このNameキー・プロパティに、ドメイン内の他のすべてのMBeanの間で一意の値を指定する必要があります。

Type=type

構成MBeanおよびランタイムMBeanの場合は、MBeanタイプの短縮名。短縮名は、MBean接尾辞の付かない、未修飾のタイプ名です。たとえば、ServerRuntimeMBeanのインスタンスであるMBeanに対しては、ServerRuntimeを使用します。

システム・レベルで指定されたサービスを管理するMBeanの場合は、BeanまたはMBean接尾辞を含めたMBeanタイプの完全修飾名。たとえば、システム・レベルのJDBCデータ・ソースを管理するMBeanに対しては、weblogic.j2ee.descriptor.wl.JDBCDataSourceBeanを使用します。

TypeOfParentMBean=

NameOfParentMBean

階層的なネームスペースを作成するために、WebLogic Server MBeanは、オブジェクト名の中でこの属性の1つまたは複数のインスタンスを使用します。階層のレベルによってスコープが示されます。たとえば、階層のドメイン・レベルにあるLogMBeanはドメイン全体のメッセージ・ログを管理し、サーバー・レベルにあるLogMBeanはサーバー固有のメッセージ・ログを管理します。

暗黙的なcreatorメソッドを持つWebLogic Server子MBeanは、親MBeanのNameプロパティと同じ値を使用します。たとえば、MedRecServer Server MBeanの子であるLogMBeanはそのオブジェクト名でName=MedRecServerを使用します。

medrec:Name=MedRecServer,Type=Log,Server=MedRecServer

親MBeanに同じタイプの複数の子がある場合、WebLogic Serverではこの規約に従うことができません。

一部のMBeanはこのキー・プロパティの複数のインスタンスを使用して一意の識別子を指定します。たとえば、MedRecサンプル・アプリケーションのEJBComponentRuntime MBeanのオブジェクト名は次のとおりです。

medrec:ApplicationRuntime=MedRecServer_MedRecEAR,
Name=MedRecServer_MedRecEAR_Session
EJB,ServerRuntime=MedRecServer,Type=EJBComponentRuntime

ApplicationRuntime=MedRecServer_MedRecEARというキー・プロパティは、このEJBインスタンスがMedRecエンタープライズ・アプリケーションの中のモジュールであり、MedRecServer_MedRecEAR ApplicationRuntimeMBeanの子であることを表します。ServerRuntime=MedRecServerというキー・プロパティは、このEJBインスタンスがMedRecServerというサーバーに現在デプロイされていて、MedRecServer ServerRuntimeMBeanの子であることを表します。

Location=servername

ドメイン実行時MBeanサーバーを使用して実行時MBeanまたは構成MBeanにアクセスする場合は、MBeanオブジェクト名に、そのMBeanが格納されているサーバー・インスタンスの名前を指定するLocation=servernameキー・プロパティを含めます。「MBeanサーバー」を参照してください。

DomainRuntimeMBeanやServerLifeCycleRuntimeMBeanなどのシングルトンMBeanは管理サーバーにのみ存在するので、オブジェクト名にこのキー・プロパティを含める必要はありません。

MBeanServerInvocationHandler

MBeanServerInvocationHandlerを使用してMBeanのプロキシを作成する場合、

Intf proxy = (Intf)
MBeanServerInvocationHandler.newProxyInstance(mbs,
name,
Intf.class,
false);

次のように、javax.management.MBeanServerInvocationHandlerのかわりにWLS拡張MBeanServerInvocationHandlerを含める必要があります。

import weblogic.management.jmx.MBeanServerInvocationHandler;

このため、返される例外が正しく処理されます。

MBeanサーバー

MBeanサーバーは、すべてのJMXエージェントのコアとなるものであり、MBeanのコンテナとして機能します。

管理サーバーのJVMは、Oracleから提供される3種類のMBeanサーバーを保持しており、さらに必要に応じてJDK自体から提供されるプラットフォームMBeanサーバーを保持します。管理対象サーバーのJVMは、OracleのMBeanサーバーを1種類だけ保持しており、さらに必要に応じてプラットフォームMBeanサーバーを保持します。

表2-2に、各MBeanサーバーを示します。

表2-2 WebLogic ServerドメインのMBeanサーバー

MBeanサーバー

作成、登録、およびアクセスを提供する対象

ドメイン・ランタイムMBeanサーバー

ドメイン全体のサービス用のMBean。このMBeanサーバーは、管理対象サーバー上にあるMBeanへの単一のアクセス・ポイントとしても機能します。このMBeanサーバーに独自の(カスタム)MBeanを登録できます(『Oracle WebLogic Server JMXによる管理可能アプリケーションの開発』のドメイン・ランタイムMBeanサーバーへのカスタムMBeanの登録に関する項を参照してください)。

オブジェクト名を作成してこのMBeanサーバーのWebLogic Server MBeanにアクセスするJMXクライアントでは、そのMBeanオブジェクト名にLocation=servernameキー・プロパティを追加する必要があります。「WebLogic Server MBeanのオブジェクト名」を参照してください。

管理サーバーのみが、このMBeanサーバーのインスタンスのホストとなります。

ランタイムMBeanサーバー

特定のWebLogic Serverインスタンスのモニター、実行時制御、およびアクティブな構成を公開するMBean。このMBeanサーバーに独自の(カスタム)MBeanを登録することもできます(『Oracle WebLogic Server JMXによる管理可能アプリケーションの開発』のドメイン・ランタイムMBeanサーバーへのカスタムMBeanの登録に関する項を参照してください)。

このリリースでは、WebLogic ServerランタイムMBeanサーバーはデフォルトでプラットフォームMBeanサーバーとして構成されています。ただし、別のMBeanサーバーを作成してプラットフォームMBeanサーバーのかわりに使用するようWebLogic Serverを構成できます。「プラットフォームMBeanサーバーの使用」を参照してください。

ドメイン内の各サーバーが、このMBeanサーバーのインスタンスのホストとなります。

編集MBeanサーバー

保留中の構成MBeanと、WebLogic Serverドメインの構成を制御する操作。変更のロック、保存、およびアクティブ化用のConfigurationManagerMBeanを公開します。

管理サーバーのみが、このMBeanサーバーのインスタンスのホストとなります。

JVMのプラットフォームMBeanサーバー

JVM自体のモニター情報を保持する、JDKから提供されるMBean。このMBeanサーバーでカスタムMBeanを登録できます。

このリリースでは、WebLogic Serverはデフォルトで、JVMのプラットフォームMBeanサーバーを使用してWebLogicランタイムMBeanを格納します。したがって、プラットフォームMBeanサーバーは1つのサーバー・インスタンス上にあるプラットフォームMXBean、WebLogicランタイムMBean、およびWebLogic構成MBeanへのアクセスを提供します。「プラットフォームMBeanサーバーの使用」、および『Oracle WebLogic Server JMXによる管理可能アプリケーションの開発』のJVMプラットフォームMBeanサーバーへのMBeanの登録に関する項を参照してください。

MBeanサーバーへの接続

JMXではローカルおよびリモートの両方からMBeanサーバーにアクセスできますが、JMXクライアントは2種類のアクセスに対して別々のAPIを使用し、WebLogic Server MBeanサーバーはローカル・クライアントとリモート・クライアントに対して別々の機能を公開しています。

MBeanサーバーへのローカル接続

WebLogic Server JVM内で実行されているJMXクライアントは、JNDIを介してそのサーバーのランタイムMBeanサーバーまたはドメイン・ランタイムMBeanサーバーに直接アクセスできます。ロールを必要とするMBeanにアクセスするには、認証が必要です。これは、ローカル・アクセスを許可する唯一のWebLogic Server MBeanサーバーです。ローカル・クライアントからアクセスされると、ランタイムMBeanサーバーまたはドメイン・ランタイムMBeanサーバーは、そのjavax.management.MBeanServerインタフェースを返します。クライアントは、このインタフェースを使用して、WebLogic Server MBeanにアクセスしたり、カスタムMBeanを作成および登録したり、カスタムMBeanにアクセスしたりできます。「ランタイムMBeanサーバーへのローカル接続の作成」と「ドメイン・ランタイムMBeanサーバーへのローカル接続の作成」を参照してください。

JMXクライアントは、ローカルのJVMのプラットフォームMBeanサーバーにアクセスすることもできます。すべてのローカル・クライアントが、このMBeanサーバーのMBeanにアクセスできます。『Oracle WebLogic Server JMXによる管理可能アプリケーションの開発』のJVMプラットフォームMBeanサーバーへのMBeanの登録に関する項を参照してください。

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

リモートJMXクライアント(MBeanサーバーとは異なるJVM実行されているクライアント)は、javax.management.remote APIを使用して、WebLogic MBeanサーバーにアクセスできます。そのためには、WebLogic Serverのセキュリティ・フレームワークを使用したクライアントの認証が必要です(「WebLogic Server MBeanのセキュリティ」を参照)。リモート・クライアントからアクセスされると、WebLogic Server MBeanサーバーは、そのjavax.management.MBeanServerConnectionインタフェースを返します。「MBeanサーバーへのリモート接続の作成」を参照してください。

プラットフォームMBeanサーバーへのリモート・アクセスを有効にできます。『Oracle WebLogic Server JMXによる管理可能アプリケーションの開発』のJVMプラットフォームMBeanサーバーへのMBeanの登録に関する項を参照してください。

プラットフォームMBeanサーバーの使用

このリリースのWebLogic Serverでは、WebLogic ServerランタイムMBeanサーバーは、対応するサーバー用のプラットフォームMXBeanを格納するようにデフォルトで構成されています。ドメイン・ランタイムMBeanサーバーには、ドメイン内のすべてのサーバー用のプラットフォームMXBeanが格納されます。プラットフォームMXBeanのMBeanオブジェクト名は、JVMによって提供されるMBeanの名前と同じですが、プラットフォームMXBeanにはLocation=servernameキー・プロパティが追加で指定されます。

例2-3のWLSTスクリプトは、プラットフォームMXBeanを使用して稼働中ドメインのリソースをモニターする方法を示しています。

例2-3 プラットフォームMXBeanの使用

"""
This WLST script demonstrates how to use the Platform MXBeans to monitor
the resources of a running WLS domain. It uses the domainCustom command
to retrieve the memory usage for 2 servers in the domain. For information
on the available platform MXBeans, refer to the following link:
http://docs.oracle.com/javase/7/docs/api/java/lang/management/package-summary.html
"""

connect()
domainCustom()
cd ("java.lang")
# monitor heap and thread usage once a minute for 5 minutes
x = 0
while x < 5:
# Admin Server
cd ("java.lang:Location=AdminServer,type=Memory")
huAdmin = get("HeapMemoryUsage")
cd ("..")
cd ("java.lang:Location=AdminServer,type=Threading")
numThreadsAdmin = get("ThreadCount")
print "Admin server memory usage = ", huAdmin.get("max"), " number threads: ", numThreadsAdmin
cd ("..")
# m1 server
cd ("java.lang:Location=m1,type=Memory")
huM1 = get("HeapMemoryUsage")
cd ("..")
cd ("java.lang:Location=m1,type=Threading")
numThreadM1 = get("ThreadCount")
cd ("..")
print "M1 server memory usage = ", huM1.get("max"), " number threads: ", numThreadM1
Thread.sleep(60000)
x = x + 1

プラットフォームMBeanサーバーをランタイムMBeanサーバーとして使用するかどうかは、JMX MBeanのPlatformMBeanServerUsed属性によって制御されます。これまでのリリースでは、PlatformMBeanServerUsed属性のデフォルト値はfalseだったため、プラットフォームMBeanサーバーは明示的に有効化しないかぎり使用されませんでした。このリリースのWebLogic Serverでは、バージョン10.3.3.0以降のドメインに対するPlatformMBeanServerUsed属性のデフォルト値はtrueです。詳細は、Oracle WebLogic Server MBeanリファレンスのPlatformMBeanServerEnabledを参照してください。

必要に応じて、『Oracle WebLogic Serverの理解』の管理ツールおよびAPIの概要に関する項に記載されているいずれかの管理ツールを使用してPlatformMBeanServerEnabled属性値をfalseに設定し、WebLogic Serverを構成して個別のMBeanサーバーを作成したり、プラットフォームMBeanサーバーのかわりに作成したサーバーを使用できます。WebLogic Server管理コンソールを使用し、「ドメイン」→「構成」→「全般」ページ→「詳細」オプションに移動して、「プラットフォームMBeanサーバーの使用」チェック・ボックスの選択を解除します。WLSTでは、編集セッションを起動してドメインのJMXディレクトリに移動し、cmo.setPlatformMBeanServerUsed(false)を使用して値を変更して変更内容をアクティブ化します。

プラットフォームMBeanサーバーとプラットフォームMXBeanの詳細は、次のJAVA SDKドキュメントを参照してください。

- http://docs.oracle.com/javase/7/docs/technotes/guides/management/mxbeans.html

- http://docs.oracle.com/javase/7/docs/api/java/lang/management/package-summary.html

サービスMBean

WebLogic Serverでは、各MBeanサーバーにサービスMBeanが単純なオブジェクト名で登録されます。このMBeanの属性と操作は、WebLogic Server MBean階層へのエントリ・ポイントとして機能します。JMXクライアントは、これらを使用して1つのオブジェクト名を入力するだけでMBeanサーバーのすべてのWebLogic Server MBeanに移動できます。表2-3を参照してください。

エントリ・ポイント(サービス)MBeanを使用しないJMXクライアントは、MBeanの属性を取得および設定したり、その操作を呼び出したりするために、MBeanのオブジェクト名を正確に構築する必要があります。オブジェクト名は一意でなければならないため、それらは通常長く、クライアントから構築するのは困難です。

表2-3 サービスMBean

MBeanサーバー

サービスMBean

JMXオブジェクト名

ドメイン・ランタイムMBeanサーバー

DomainRuntimeServiceMBean

アプリケーション・デプロイメント、JMSサーバー、JDBCデータ・ソースなど、ドメイン全体のサービス用のMBeanへのアクセスを提供します。ドメインにある全サーバーのすべてのランタイムMBeanとアクティブな構成MBeanの階層に対する単一のアクセス・ポイントにもなります。

Oracle WebLogic Server MBeanリファレンスのDomainRuntimeServiceMBeanに関する項を参照してください。

com.bea:Name=DomainRuntimeService,Type=weblogic.
management.mbeanservers.
domainruntime.DomainRuntimeServiceMBean

ランタイムMBeanサーバー

RuntimeServiceMBean

現在のサーバーのランタイムMBeanとアクティブな構成MBeanへのアクセスを提供します。

Oracle WebLogic Server MBeanリファレンスのRuntimeServiceMBeanに関する項を参照してください。

com.bea:Name=RuntimeService,
Type=weblogic.management.
mbeanservers.runtime.
RuntimeServiceMBean

編集MBeanサーバー

EditServiceMBean

現在のWebLogic Serverドメインの構成を管理するためのエントリ・ポイントを提供します。

Oracle WebLogic Server MBeanリファレンスのEditServiceMBeanに関する項を参照してください。

com.bea:Name=EditService,
Type=weblogic.management.
mbeanservers.edit.
EditServiceMBean

WebLogic Server MBeanのセキュリティ

WebLogic Server MBeanサーバーに接続するには、JMXクライアントで、WebLogic Serverドメインのセキュリティ・レルムに定義されているユーザーに資格証明を提供する必要があります。

MBeanサーバーに登録されているMBeanの保護を強化するために、WebLogic Serverではセキュリティ・ロールとセキュリティ・ポリシーが使用されます。セキュリティ・グループなどのセキュリティ・ロールによって、ユーザーにIDが付与されます。ただしグループとは違い、ロールのメンバーシップは実行時に評価される条件を基準とすることができます。セキュリティ・ポリシーは、リソースにアクセス可能なユーザー、グループ、またはロールを指定する、別の実行時条件です。WebLogic Server MBean用に、ロールおよびポリシーのデフォルト・セットが用意されています。(Oracle WebLogic Server MBeanリファレンスのMBeanのデフォルト・セキュリティ・ポリシーに関する項を参照。)

WebLogic Serverインスタンスの起動サイクルの間、サーバーでは、MBeanセキュリティ・ポリシーをメモリー内で表現したものであるweblogic.security.service.JMXResourceオブジェクトの集合が作成されます。JMXクライアントがMBean属性の取得や設定、または操作の呼出しを試行すると、MBeanサーバーはそのユーザーに十分な許可が与えられているかどうかセキュリティ・レルムに問い合せます。セキュリティ・レルムでは、ユーザーが属しているロールが最初に判別されます。(ロールの割当ては実行時に判別されます。)次に、デフォルトのポリシーおよび作成済のその他のポリシーが使用され、そのロールがアクセスを許可されているかどうかが判別されます。

デフォルトのアクセス許可は、WebLogic Server管理コンソールを使用して変更できます。たとえば、特定のアプリケーション用のロールを作成して、そのアプリケーションに関連付けられているMBeanインスタンスに特定のロールのみがアクセスできるようにすることが可能です。Oracle WebLogic Server管理コンソール・オンライン・ヘルプのJMXポリシーの構成に関する項を参照してください。

一部の属性および操作用のその他のセキュリティ・リソース

特に重要なデータやアクションを表すMBeanの属性と操作の場合、WebLogic Serverでは、そうしたデータまたはアクションにアクセスできるユーザーを制限するための追加のセキュリティ・リソース・オブジェクトが用意されています。たとえば、ServerLifeCycleRuntimeMBeanのshutdown()操作はJMXResourceオブジェクトとweblogic.security.service.ServerResourceオブジェクトによって保護されます。複数のリソースによって保護される属性および操作の完全なリストについては、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』の管理リソースに関する項およびサーバー・リソースに関する項を参照してください。

これらの属性および操作に対するセキュリティ・ポリシーおよびロールのデフォルト構成が連携することによって、一貫性のあるセキュリティ方式が作成されます。しかし、変更を行った結果、意図しないアクセス制限が発生する場合があります。『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』の一貫性のあるセキュリティ方式の維持に関する項を参照してください。

3 WebLogic ServerサブシステムMBeanの概要

この章では、ドメインとサーバーのロギング、JMSサーバーとJMSシステム・モジュール・リソース、およびJDBCリソースも含めて、WebLogic Serverの様々なサブシステムの管理に使用できるMBeanについて説明します。

この章の内容は以下のとおりです。

- ドメインおよびサーバー・ロギングの構成

- JMSサーバーおよびJMSシステム・モジュールの構成

- JDBCリソースの構成

さらに、WebLogicのセキュリティ管理に使用できるMBeanについては、「セキュリティMBeanの階層の理解」を参照してください。

ドメインおよびサーバー・ロギングの構成

WebLogic Serverドメインでは、複数のMBeanがロギング・サービスを構成します。表3-1にそれらのMBeanを示し、図3-1に構成MBean階層内でのMBeanの場所を示します。

表3-1 ドメインおよびサーバー・ロギングのMBean

MBean

構成する対象

LogMBean

- ログ出力に対するフィルタ設定および重大度のしきい値。

- Log4jの実装またはデフォルトのJavaロギングAPIのどちらをベースにしてサーバーのロギングを行うか。

- JVMの標準出力および標準エラー出力を登録済みのログ宛先にリダイレクトするかどうか。

管理サーバーはドメイン全体のメッセージ・ログに対するLogMBeanのインスタンスを保持し、各サーバー・インスタンスはローカル・サーバー・ログに対する独自のインスタンスを保持します。

Oracle WebLogic Server MBeanリファレンスのLogMBeanに関する項を参照してください。

LogFileMBean

ログ・メッセージの格納時にWebLogic Serverインスタンスで使用されるログ・ファイル名と場所、ファイル・ローテーション条件、およびファイル数。

Oracle WebLogic Server MBeanリファレンスのLogFileMBeanに関する項を参照してください。

LogFilterMBean

登録されたログの宛先にサーバー・インスタンスが送信するメッセージを決定するログ・フィルタ。各ログ・フィルタはLogFilterMBeanの独自のインスタンスで表現されます。

ログ・フィルタは、ドメイン・レベルでもサーバー・レベルでも定義できます。

Oracle WebLogic Server MBeanリファレンスのLogFilterMBeanに関する項を参照してください。

ServerMBean

サーバーのJTAトランザクション・ログ・ファイルのパス接頭辞。

Oracle WebLogic Server MBeanリファレンスのServerMBeanに関する項を参照してください。

WebServerMBean

ロギングHTTPリクエスト。

Oracle WebLogic Server MBeanリファレンスのWebServerMBeanに関する項を参照してください。

VirtualHostMBean

ユーザーが定義した仮想ホストのロギングHTTPリクエスト。

Oracle WebLogic Server MBeanリファレンスのVirtualHostMBeanに関する項を参照してください。

JMSServerMBean

このJMSサーバーのメッセージ・ログ・ファイル。

Oracle WebLogic Server MBeanリファレンスのJMSServerMBeanに関する項を参照してください。

図3-1 ロギングのMBean

JMSサーバーおよびJMSシステム・モジュールの構成

WebLogic Serverドメインでは、複数のMBeanがJMSサーバーおよびJMSシステム・モジュール・リソースを構成します。JMSサーバーはドメインのconfig.xmlファイルに保持され、クラスタ内の様々なWebLogic Serverインスタンスで複数のJMSサーバーを構成できます(独自の名前が付けられている場合)。JMXを使用してJMSシステム・モジュールが作成される場合、ドメイン・ディレクトリのconfig\jmsサブディレクトリにJMSシステム・モジュール記述子ファイルが作成され、ドメインのconfig.xmlファイルにJMSSystemResource要素としてそのモジュールへの参照が追加されます。この参照には、JMSシステム・モジュール・ファイルへのパス、およびこのシステム・モジュールがデプロイされるサーバーとクラスタのリストが含まれます。

表3-2にそれらのMBeanを示し、図3-2に構成MBean階層内でのMBeanの場所を示します。

表3-2 JMSサーバーおよびJMSシステム・モジュール・リソースのMBean

MBean

構成する対象

JMSServerMBean

JMSサーバーは、JMSシステム・モジュール内のターゲット宛先リソース(キューおよびトピック)の管理コンテナとして機能する構成エンティティ。JMSサーバーの最も重要な役割は、JMSサーバーの宛先で受信されるすべての永続メッセージ用の永続ストアに関する情報を管理することと、JMSサーバーの宛先で作成される恒久サブスクライバの状態を管理することです。また、ターゲット宛先のコンテナとして、JMSサーバーに対して加えられた構成の変更または実行時の変更をすべての宛先に対して有効にできます。

Oracle WebLogic Server MBeanリファレンスのJMSServerMBeanに関する項を参照してください。

JMSSystemResourceMBean

JMSシステム・リソースは、その定義がアプリケーションではなく、システム構成の一部であるリソース。リソースの記述子は、WebLogic構成ファイルを介してリンクされますが、別の記述子ファイル内に存在します。

Oracle WebLogic Server MBeanリファレンスのJMSSystemResourceMBeanに関する項を参照してください。

SubDeploymentMBean

サブデプロイメントを使用すると、JMSモジュール内の一部のリソースをJMSサーバーへ、その他のJMSリソースをサーバー・インスタンスまたはクラスタへデプロイできます。スタンドアロンのキューまたはトピックでは、1つのJMSサーバーのみをターゲットとして指定できます。一方、接続ファクトリ、共通分散宛先(uniform distributed destination: UDD)、および外部サーバーでは、1つまたは複数のJMSサーバーやサーバー・インスタンス、またはクラスタをターゲットとして指定できます。このため、サブデプロイメントに複数のJMSサーバーをターゲットとするメンバーが含まれる場合、スタンドアロンのキューまたはトピックをそのサブデプロイメントに関連付けることはできません。UDDを使用すると、こうしたサブデプロイメントとも関連付けることができます。これは、UDDがドメイン内の複数のJMSサーバーに対してメンバーを分散させることを目的としているためです。

Oracle WebLogic Server MBeanリファレンスのSubDeploymentMBeanに関する項を参照してください。

JMSBean

JMSモジュールBeanツリーの最上位。すべてのJMSモジュールはルートBean (親のないBean)としてJMSBeanを持ちます。

Oracle WebLogic Server MBeanリファレンスのJMSBeanに関する項を参照してください。

DestinationKeyBean

宛先が受信メッセージに適用できる、一意のソート順を定義します。デフォルトでは、メッセージのソート順は、各メッセージの一意のJMSMessageIDに基づいて昇順にソートが行われる、FIFO (先入れ先出し)になります。ただし、LIFO (後入れ先出し)など、宛先に対して別のソート方式を使用するように宛先キーを構成することもできます。

Oracle WebLogic Server MBeanリファレンスのDestinationKeyBeanに関する項を参照してください。

DistributedQueueBean

複数のJMSサーバーに分散されるが、単一の論理キューとしてJMSクライアントにアクセス可能な、一連のキューを定義します。分散キューは、ロード・バランシングおよび負荷分散に役立ち、スタンドアロンのキューと同じプロパティを多く持ちます。

Oracle WebLogic Server MBeanリファレンスのDistributedQueueBeanに関する項を参照してください。

DistributedTopicBean

複数のJMSサーバーに分散されるが、単一の論理トピックとしてJMSクライアントにアクセス可能な、一連のトピックを定義します。分散トピックは、ロード・バランシングおよび負荷分散に役立ち、スタンドアロンのトピックと同じプロパティを多く持ちます。

Oracle WebLogic Server MBeanリファレンスのDistributedTopicBeanに関する項を参照してください。

ForeignServerBean

現在のドメインの一部ではない、外部のメッセージング・プロバイダまたはリモートWebLogic Serverインスタンスを定義します。これは、他のベンダーのJMS製品と統合を行う際、またはローカルWebLogic JNDIツリーにおいて他のクラスタまたはドメイン内のWebLogic Serverのリモート・インスタンスを参照する際に、役立ちます。

Oracle WebLogic Server MBeanリファレンスのForeignServerBeanに関する項を参照してください。

JMSConnectionFactoryBean

JMSクライアントに対する接続の作成に使用される、一連の接続構成パラメータを定義します。接続ファクトリは、JMSクライアントへ返される接続のプロパティを構成できるほか、デフォルトの配信、トランザクション、およびメッセージ・フロー制御パラメータについて構成可能なオプションを提供します。

Oracle WebLogic Server MBeanリファレンスのJMSConnectionFactoryBeanに関する項を参照してください。

QueueBean

非同期のピア通信に使用される、ポイント・ツー・ポイント宛先のタイプを定義します。キューに配信されたメッセージは、1つのコンシューマにのみ配信されます。しきい値、ロギング、配信オーバーライド、配信エラーのオプションなど、キューの動作を多面的に構成できます。

Oracle WebLogic Server MBeanリファレンスのQueueBeanに関する項を参照してください。

QuotaBean

宛先で使用できるシステム・リソースの割当てを制御します。たとえば、宛先で格納できるバイト数をQuotaリソースを使って構成できます。

Oracle WebLogic Server MBeanリファレンスのQuotaBeanに関する項を参照してください。

SAFRemoteContextBean

JMS宛先のエクスポート元であるリモート・サーバー・インスタンスまたはクラスタのURLを定義します。また、リモート・クラスタまたはサーバーで認証および認可されるセキュリティ資格証明も含まれます。

Oracle WebLogic Server MBeanリファレンスのSAFRemoteContextBeanに関する項を参照してください。

SAFErrorHandlingBean

SAFサービスがリモート宛先へのメッセージの転送に失敗した場合に行う処理を定義します。構成オプションには、エラー処理ポリシー(リダイレクト、ログ、破棄、または常に転送)、ログ・フォーマット、および送信の再試行に関するパラメータが含まれます。

Oracle WebLogic Server MBeanリファレンスのSAFErrorHandlingBeanに関する項を参照してください。

SAFImportedDestinationsBean

インポート済みのストア・アンド・フォワード(SAF)宛先の集合を定義します。SAF宛先は、ローカル・サーバー・インスタンスまたはクラスタがリモート・サーバー・インスタンスまたはクラスタにメッセージを送信できるよう、ローカル・クラスタまたはサーバー・インスタンスにインポートされるリモート・サーバー・インスタンスまたはクラスタにおけるキューまたはトピックを表します。宛先のSAFエクスポートのパラメータが明示的に無効になっていない限り、デフォルトでは、すべてのJMS宛先が自動でエクスポートされます。SAFのインポートされた宛先の各集合は、リモートSAFコンテキスト・リソース、また必要に応じてSAFエラー処理リソースに関連付けられています。

Oracle WebLogic Server MBeanリファレンスのSAFImportedDestinationsBeanに関する項を参照してください。

TemplateBean

複数の宛先について、一連のデフォルト構成設定を定義します。宛先でテンプレートが指定されているが、パラメータの値が明示的に設定されていない場合、そのパラメータは、指定済みのテンプレートからその値を取得します。

Oracle WebLogic Server MBeanリファレンスのTemplateBeanに関する項を参照してください。

TopicBean

非同期のピア通信に使用される、パブリッシュ/サブスクライブ宛先のタイプを定義します。トピックに配信されたメッセージは、すべてのトピック・コンシューマに配信されます。しきい値、ロギング、配信オーバーライド、配信エラー、マルチキャストのパラメータなど、トピックの動作を多面的に構成できます。

Oracle WebLogic Server MBeanリファレンスのTopicBeanに関する項を参照してください。

UniformDistributedQueueBean

共通の構成を持つ分散キューを定義します。そのメンバーは、すべての分散キュー・パラメータ(特に、重み付け、セキュリティ、永続性、ページング、および割当てにかかわるもの)について、一貫した構成を備えています。これらの共通分散キュー・メンバーは、共通分散キューのターゲット指定に基づき、JMSサーバー上に作成されます。共通分散キューは、メッセージのロード・バランシングおよび配信に役立つものであり、しきい値、ロギング、配信オーバーライド、および配信エラーのパラメータを含めて、スタンドアロン・キューと同じプロパティを多く備えています。

Oracle WebLogic Server MBeanリファレンスのUniformDistributedQueueBeanに関する項を参照してください。

UniformDistributedTopicBean

共通の構成を持つ分散トピックを定義します。そのメンバーは、すべての分散キュー・パラメータ(特に、重み付け、セキュリティ、永続性、ページング、および割当てにかかわるもの)について、一貫した構成を備えています。これらの共通分散トピック・メンバーは、共通分散トピックのターゲット指定に基づき、JMSサーバー上に作成されます。共通分散トピックは、メッセージのロード・バランシングおよび配信に役立つものであり、しきい値、ロギング、配信オーバーライド、および配信エラーのパラメータを含めて、スタンドアロン・トピックと同じプロパティを多く備えています。

Oracle WebLogic Server MBeanリファレンスのUniformDistributedTopicBeanに関する項を参照してください。

図3-2 JMSサーバーおよびJMSシステム・リソースのMBean

JDBCリソースの構成

JDBCリソース(データ・ソースまたはマルチ・データ・ソース)を、WebLogic Server管理コンソールまたはWebLogic Scripting Tool (WLST)を使って作成すると、WebLogic Serverはドメイン・ディレクトリのサブディレクトリconfig/jdbcにJDBCモジュールを作成し、ドメインの構成ファイル(config.xml)にモジュールへの参照を追加します。

表3-3にそれらのMBeanを示し、図3-3に構成MBean階層内でのMBeanの場所を示します。

表3-3 JDBCリソースのMBean

MBean

構成する対象

JDBCSystemResourceMBean

データ・ソース・モジュールから作成されたJavaBeanのコンテナ。ただし、JDBCデータ・ソースに対するJMXのアクセスは、すべてJDBCSystemResourceMBean経由で行われます。データ・ソース・モジュールから作成された個々のJavaBeanに直接アクセスすることはできません。

Oracle WebLogic Server MBeanリファレンスのJDBCSystemResourceMBeanに関する項を参照してください。

JDBCDataSourceBean

JDBCデータ・ソースBeanツリーの最上位。すべてのJDBCデータ・ソースは、ルートBean (親のないBean)としてJDBCDataSourceBeanを持ちます。

Oracle WebLogic Server MBeanリファレンスのJDBCDataSourceBeanに関する項を参照してください。

JDBCDriverParamsBean

データ・ソースのドライバ・パラメータを格納します。データ・ソースで使用されるJDBCドライバ用の構成パラメータは、ドライバ・パラメータBeanを使用して指定します。

Oracle WebLogic Server MBeanリファレンスのJDBCDriverParamsBeanに関する項を参照してください。

JDBCConnectionPoolParamsBean

データ・ソースの接続プール・パラメータを格納します。データ・ソースの接続プールの構成パラメータは、接続プールのパラメータBeanを使用して指定します。

Oracle WebLogic Server MBeanリファレンスのJDBCConnectionPoolBeanに関する項を参照してください。

JDBCDataSourceParamsBean

データ・ソースの基本使用パラメータを格納します。データ・ソースの基本使用のための構成パラメータは、データ・ソースのパラメータBeanを使用して指定します。

Oracle WebLogic Server MBeanリファレンスのJDBCDataSourceParamsBeanに関する項を参照してください。

JDBCXAParamsBean

データ・ソースのXA関連パラメータを格納します。データ・ソースのXA関連動作用の構成パラメータは、XAパラメータBeanを使用して指定します。

Oracle WebLogic Server MBeanリファレンスのJDBCXAParamsBeanに関する項を参照してください。

図3-3 JDBCリソースのMBean

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

この章では、JMXクライアントからWebLogic Server MBeanにアクセスする方法について説明します。リモート・クライアントのクラスパスを設定する方法、MBeanサーバーへのローカル接続とリモート接続を作成する方法、およびMBean階層においてナビゲートする方法について説明します。

この章の内容は以下のとおりです。

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

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

- ランタイムMBeanサーバーへのローカル接続の作成

- ドメイン・ランタイムMBeanサーバーへのローカル接続の作成

- MBean階層内の移動

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

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

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

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

WL_HOME\server\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を使用するようクライアントで自動的に変換されます。

注意:
JDKが変更されたため、WLSはwlclient.jarのみでJMXをサポートしていません。JMXを試用するには、"full client" (weblogic.jar)またはwljmxclientのいずれかを使用する必要があります。

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

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

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

1. javax.management.remote.JMXServiceURLオブジェクトを作成して、MBeanサーバーのアドレスを記述します。
次のパラメータ値をコンストラクタに渡します(Java SE 7 API仕様のJMXServiceURL (http://docs.oracle.com/javase/7/docs/api/javax/management/remote/JMXServiceURL.html)を参照)。

- 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)

次のパラメータ値をコンストラクタに渡します(Java SE 7 API仕様のJMXConnectorFactory (http://docs.oracle.com/javase/7/docs/api/javax/management/remote/JMXConnectorFactory.html)を参照)。

- 前の手順で作成した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サーバーへの接続です。このオブジェクトは、ローカルおよびリモートの接続に使用できます。Java SE 7 API仕様のMBeanServerConnection (http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanServerConnection.html)を参照してください。

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サーバーとの接続を閉じる(Java SE 7 API仕様のJMXConnector (http://docs.oracle.com/javase/7/docs/api/javax/management/remote/JMXConnector.html)を参照してください。)

例4-1 ドメイン・ランタイムMBeanサーバーへの接続

public class MyConnection {

private static MBeanServerConnection connection;
private static JMXConnector connector;
private static final ObjectName service;
/*
* Initialize connection to the Domain Runtime MBean Server.
*/
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 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サーバーによって有効化される簡略化されたコード・メンテナンスおよび強化セキュリティが推奨されます。

注意:
JMX通知がMBeansに追加されると、ドメイン・ランタイムMBeanサーバーは大量のメモリーを消費する可能性があります。JMX通知が使用されると、次の2つの場合には、ドメイン内のすべての管理対象サーバーで実行されるすべてのランタイムMBeanサーバーに登録されたすべてのJMXオブジェクト名のコピーを管理サーバーが保持することになります。

- WebLogic Serverレベルで、管理対象サーバーの停止の際の未登録MBean通知をシミュレートする場合。

- JDK JMXクライアント通知レイヤーにおいて。

次の条件がどちらも当てはまる場合、この問題が発生する可能性は高くなります。

- 通知リスナーをドメイン・ランタイムMBeanサーバーに追加するため、大きなドメインの管理にEM Fusion Middleware Controlが使用されている。

- JMXランタイムMBeanの数を大幅に増やすFusion Middleware製品がドメインに含まれている。これには、ドメイン内で実行されているWebLogic ServerランタイムMBeanサーバー・インスタンス(つまり、管理サーバーとすべての管理対象サーバー)に登録されているMBeanを含む任意の製品が含まれます。(これらの製品には、Coherence、SOA Suite、OSBなどがあります。)

このような特定のスケーリング問題を排除するには、managed-server-notifications-enabled属性を無効にします。この構成属性は、管理対象サーバー・ランタイムMBeanサーバーに含まれるMBeanで通知を定義する機能を無効にします(これらのMBeanのObjectNameにはLocation=keyが含まれています)。

管理対象サーバー通知が無効になると、WebLogic ServerおよびJDKコンポーネントに含まれるMBeanの2つのObjectNameセットが保持されなくなります。通知リスナーは、MBeanServerDelegateや、ローカルのドメイン・ランタイムMBeanサーバーに含まれるMBeanでも定義できます。ただし、通知リスナーをローカルでないMBeanに追加することはできません。

managed-server-notifications-enabled属性は、WLSTを使用して、次のように設定できます。

edit()
startEdit()
cd("JMX/domain-name")
cmo.setManagedServerNotificationsEnabled(false)
activate()

図4-1 ドメイン・ランタイムMBeanサーバーとランタイムMBeanサーバー

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

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

1. wljmxclient.jarとwlclient.jarをクライアント・クラスパスに指定しない場合:

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

2. 管理者権限を持つWebLogic Serverユーザーになるように、デフォルトのIIOPユーザーを構成します。

Oracle WebLogic Server管理コンソール・オンライン・ヘルプのIIOPの有効化と構成に関する項を参照してください。

wljmxclient.jarとwlclient.jarがクライアント・クラスパスに存在する場合、デフォルトのIIOPユーザーを有効にする必要はありません。ステップ2に進みます。

注意:
wlclient.jarはwljmxclient.jarのMANIFEST ClassPathエントリにあるので、wlclient.jarとwljmxclient.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-hostとWLS-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()などの追加のメソッドがあります。(Java SE 7 API仕様のMBeanServer (http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanServer.html)を参照してください。)

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()などのメソッドもあります。(Java SE 7 API仕様のMBeanServer (http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanServer.html)を参照してください。)

注意:
ベスト・プラクティスとして、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 WebLogic Server MBeanリファレンスでそのMBeanの説明を参照してください。Oracle WebLogic Server MBeanリファレンスでは、各MBeanについて、現在のMBeanのファクトリ・メソッドを保持する親MBeanが記載されています。ファクトリ・メソッドがパブリックでないMBeanについては、Oracle WebLogic Server MBeanリファレンスに、現在のMBeanにアクセスできる他のMBeanが記載されています。

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

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

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

- クラスは、connectionグローバル変数とconnectorグローバル変数に加えて、WebLogic ServerサービスMBeanのオブジェクト名をグローバル変数に割り当てます。クラス内のメソッドはこのオブジェクト名を頻繁に使用します。このオブジェクト名は一度定義したら、変更する必要はありません。

- printServerRuntimes()メソッドは、ドメイン内のすべてのServerRuntimeMBeanインスタンスの配列を保持するDomainRuntimeServiceMBeanのServerRuntimes属性の値を取得します。(Oracle WebLogic Server MBeanリファレンスのDomainRuntimeServiceMBeanに関する項を参照。)

例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;

// Initializing the object name for DomainRuntimeServiceMBean
// so it can be used throughout the class.
static {
try {
service = new ObjectName(
"com.bea:Name=DomainRuntimeService,Type=weblogic.management.
mbeanservers.domainruntime.DomainRuntimeServiceMBean");
}catch (MalformedObjectNameException e) {
throw new AssertionError(e.getMessage());
}
}

/*
* Initialize connection to the Domain Runtime MBean Server
*/
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();
}

/*
* Print an array of ServerRuntimeMBeans.
* This MBean is the root of the runtime MBean hierarchy, and
* each server in the domain hosts its own instance.
*/
public static ObjectName[] getServerRuntimes() throws Exception {
return (ObjectName[]) connection.getAttribute(service,
"ServerRuntimes");
}

/*
* Iterate through ServerRuntimeMBeans and get the name and state
*/
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 WebLogic Server MBeanリファレンスのServletRuntimeMBeanに関する項を参照。)

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

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

2. DomainRuntimeServiceMBeanまたはRuntimeServiceMBeanのServerRuntimes属性。

3. ServerRuntimeMBean、ApplicationRuntimes属性。

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

5. WebAppComponentRuntimeMBean、ServletRuntimes属性。

例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;

// Initializing the object name for DomainRuntimeServiceMBean
// so it can be used throughout the class.
static {
try {
service = new ObjectName(
"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanser
vers.domainruntime.DomainRuntimeServiceMBean");
}catch (MalformedObjectNameException e) {
throw new AssertionError(e.getMessage());
}
}

/*
* Initialize connection to the Domain Runtime MBean Server
*/
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();
}

/*
* Get an array of ServerRuntimeMBeans
*/
public static ObjectName[] getServerRuntimes() throws Exception {
return (ObjectName[]) connection.getAttribute(service,
"ServerRuntimes");
}

/*
* Get an array of WebAppComponentRuntimeMBeans
*/
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();
}
}

5 JMXを使用したドメインの構成の管理

この章では、JMXを使用してWebLogic Serverドメインの構成を管理する方法について説明します。MBean属性を編集する方法、変更の表示と取消しを行う方法、変更のアクティブ化を追跡する方法、および暗号化されたMBean属性値の設定と取得を行う方法について説明します。例外の編集と処理を行うためのベスト・プラクティスも記載されています。

この章の内容は以下のとおりです。

- MBean属性の編集:主な手順

- 変更の表示と取消し

- 変更のアクティブ化の追跡

- ロックの管理

- ベスト・プラクティス:編集と例外処理の推奨パターン

- 暗号化された値の設定と取得

WebLogic Serverドメインの変更、および変更のアクティブ化のプロセスを理解するには、『Oracle WebLogic Serverドメイン構成の理解』の構成の変更の管理に関する項を参照してください。

MBean属性の編集:主な手順

MBean属性を編集するには、次の手順に従います。

1. 編集セッションの開始
MBean属性に対するすべての編集は編集セッションのコンテキスト内で行われます。各WebLogic Serverドメインの内部では、一度に1つの編集セッションのみをアクティブにすることができます。ユーザーが編集セッションを開始すると、WebLogic Serverは他のユーザーが保留中の構成MBean階層にアクセスできないようにロックします。「ロックの管理」を参照してください。

2. MBean属性の変更または新しいMBean作成
MBean属性の変更や新しいMBeanの作成を行うと、保留中の構成MBeanのメモリー内の階層が更新されます。これらの変更を保存する前に編集セッションを終了すると、保存されていない変更は破棄されます。

3. 保留中の構成ファイルへの変更の保存
メモリー内の階層に対して十分な変更を行ったら、その変更内容をドメインの保留中の構成ファイルに保存します。保存した変更は、アクティブ化されるか明示的に元に戻されるまで、保留中の構成ファイル内に保持されます。保存した変更をアクティブ化する前に編集セッションを終了した場合は、以降の編集セッションで、本人または他のだれかがその変更をアクティブ化できます。

アクティブ化する前に繰返し変更を行って保存することができます。たとえば、サーバーを作成して保存できます。その後で、新しいサーバーのリスニング・ポートとリスニング・アドレスを構成してその変更を保存できます。このようにコードを編集すると、エラーの修正や検証がしやすくなります。

4. 保存した変更のアクティブ化
変更をアクティブ化すると、WebLogic Serverは保存された保留中の構成ファイルをドメイン内のすべてのサーバーにコピーします。各サーバーは変更を評価して、その変更を使用できるかどうかを示します。使用できる場合、各サーバーはアクティブな構成ファイルと、構成MBeanのメモリー内の階層を更新します。

5. サーバーの再起動を必要とする変更内容で更新されたサーバー・インスタンスがあれば、再起動します。

MBeanの編集および編集のアクティブ化の例については、「例: 管理ポートの変更」を参照してください。

編集セッションの開始

編集セッションを開始するには、次の手順に従います。

1. 編集MBeanサーバーへの接続を開始します。
接続はjava.management.MBeanServerConnection型のオブジェクトを返します。

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

2. ConfigurationManagerMBeanのオブジェクト名を取得します。
ConfigurationManagerMBeanは、編集セッションの開始および停止、構成に対する変更の保存、取消しおよびアクティブ化を行うためのメソッドを提供します。(Oracle WebLogic Server MBeanリファレンスのConfigurationManagerMBeanに関する項を参照。)

各ドメインはConfigurationManagerMBeanのインスタンスを1つだけ持ち、そのインスタンスはEditServiceMBean ConfigurationManager属性に格納されます。EditServiceMBeanはすべての編集操作のエントリ・ポイントです。簡単な固定のオブジェクト名を持ち、編集MBeanサーバー内の他のすべてのMBeanにアクセスするための属性と操作が含まれています。

ConfigurationManagerMBeanオブジェクト名を取得するには、次のメソッドを使用します。

MBeanServerConnection.getAttribute(
ObjectName object-name, String attribute)

前のメソッド構文で、

- object-name: リテラル"com.bea:Name=EditService,Type=weblogic.management.mbeanservers.edit.EditServiceMBean"。これはEditServiceMBeanのオブジェクト名です。

- attribute: リテラル"ConfigurationManager"。これはConfigurationManagerMBeanを含むEditServiceMBeanの属性の名前です。

3. 編集セッションの開始
編集セッションを開始するには、ConfigurationManagerMBean startEdit(int waitTime, int timeout)操作を呼び出します。各要素の説明は次のとおりです。

- waitTime: 編集MBean階層でロックを確立するために、ConfigurationManagerMBeanが待機するミリ秒数を指定します。管理者権限を持たない限り、他の編集が進行中の場合にロックを確立することはできません(「ロックの管理」を参照してください) 。

- timeout: 編集セッションを完了しなければならないミリ秒数を指定します。編集を保存またはアクティブ化する前に時間切れになると、保存されていない変更はすべて破棄されます。

startEdit操作は次のいずれかを返します。

- 指定した時間内に編集ツリーでロックを確立できない場合は、weblogic.management.mbeanservers.edit.EditTimedOutExceptionをスローします。

- 編集ツリーを正常にロックした場合は、DomainMBeanのオブジェクト名を返します。これが編集MBean階層のルートになります。

MBean属性の変更または新しいMBean作成

既存のMBeanの属性値を変更する、新しいMBeanを作成する、またはMBeanを削除するには、次の手順に従います。

1. 編集ツリーの階層を移動して、編集するMBeanのオブジェクト名を取得します。MBeanを作成または削除するには、適切なファクトリ・メソッドを含むMBeanのオブジェクト名を取得します。
「MBeanサーバーへのリモート接続の作成」を参照してください。

2. MBean属性の値を変更するには、MBeanServerConnection.setAttribute(object-name, attribute)メソッドを呼び出します。各要素の説明は次のとおりです。

- object-name: 編集するMBeanのオブジェクト名。

- attribute: javax.management.Attributeオブジェクト。変更するMBean属性の名前とその新しい値が格納されます。

MBeanを作成するには、そのMBeanの作成メソッドを呼び出します。たとえば、ServerMBeanのインスタンスを作成するファクトリ・メソッドは、DomainMBeanのcreateServer(String name)です。Oracle WebLogic Server MBeanリファレンスでは、各MBeanのファクトリ・メソッドの場所が説明されています。(ServerMBeanに関する項を参照してください。)

3. (オプション)複数の手順に分けて編集を行う場合は、ConfigurationManagerMBean validate()操作を呼び出して、各手順の後に変更を検証することを検討してください。
validateメソッドでは、未保存のすべての変更が、MBean属性間の依存関係に関する要件を満たしているかどうかを検証し、1つの属性の値が設定されただけでは行うことのできないその他のチェックを実施します。

検証エラーが見つかった場合、validate()操作はweblogic.management.mbeanservers.edit.ValidationException型の例外をスローします。「編集操作によってスローされる例外の型」を参照してください。

save()操作も保存前に変更を検証するので、ここでの検証はオプションです。

保留中の構成ファイルへの変更の保存

ConfigurationManagerMBean save()操作を呼び出して変更を保存します。

保存した変更のアクティブ化

保存した変更をドメイン内でアクティブ化するには、次の手順に従います。

1. ConfigurationManagerMBean activate(long timeout)操作を呼び出します。timeoutには、操作が完了しなければならないミリ秒数を指定します。
activate操作はActivationTaskMBeanのインスタンスのオブジェクト名を返します。このインスタンスにはアクティブ化リクエストに関する情報が含まれています。「変更の表示と取消し」を参照してください。

activate操作が成功するかタイムアウトすると、編集可能なMBean階層でロックが解放されます。

2. JMXConnector.close()を呼び出して、MBeanサーバーへの接続を閉じます。

例:管理ポートの変更

例5-1のサンプル・コードでは、ドメインのWebLogic Server管理コンソールにアクセスするために使用するコンテキスト・パスを変更しています。この動作はDomainMBean ConsoleContextPath属性で定義されます。

サンプル・コードに関する以下の点に留意してください。

- クラスから編集MBeanサーバーへの接続方法については、「MBeanサーバーへのリモート接続の作成」を参照してください。

- 学習用にコードを簡略化するため、例5-1の例外処理は最小限のものになっています。「ベスト・プラクティス: 編集と例外処理の推奨パターン」を参照してください。

例5-1 例: 管理コンソールのコンテキスト・パスの変更

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

import javax.management.Attribute;
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 EditWLSMBeans {
private static MBeanServerConnection connection;
private static JMXConnector connector;
private static final ObjectName service;

// Initializing the object name for EditServiceMBean
// so it can be used throughout the class.
static {
try {
service = new ObjectName(
"com.bea:Name=EditService,Type=weblogic.management.mbeanservers.
edit.EditServiceMBean");
} catch (MalformedObjectNameException e) {
throw new AssertionError(e.getMessage());
}
}

/**
* ----------------------------------------------------------
* Methods to start an edit session.
* NOTE: Error handling is minimal to help you see the
*       main steps in editing MBeans. Your code should
*       include logic to catch and process exceptions.
* ----------------------------------------------------------
*/

/*
* Initialize connection to the Edit MBean Server.
*/
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.edit";

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

/**
* Start an edit session.
*/
public ObjectName startEditSession() throws Exception {
// Get the object name for ConfigurationManagerMBean.
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");

// Instruct MBeanServerConnection to invoke
// ConfigurationManager.startEdit(int waitTime int timeout).
// The startEdit operation returns a handle to DomainMBean, which is
// the root of the edit hierarchy.
ObjectName domainConfigRoot = (ObjectName)
connection.invoke(cfgMgr,"startEdit",
new Object[] { new Integer(60000),
new Integer(120000) }, new String[] { "java.lang.Integer",
"java.lang.Integer" });
if (domainConfigRoot == null) {
// Couldn't get the lock
throw new Exception("Somebody else is editing already");
}
return domainConfigRoot;

/**
* ----------------------------------------------------------
* Methods to change MBean attributes.
* ----------------------------------------------------------
*/

/**
* Modify the DomainMBean's ConsoleContextPath attribute.
*/
public void editConsoleContextPath(ObjectName cfgRoot) throws Exception {
// The calling method passes in the object name for DomainMBean.
// This method only needs to set the value of an attribute
// in DomainMBean.
Attribute adminport = new Attribute("ConsoleContextPath", new String(
"secureConsoleContext"));
connection.setAttribute(cfgRoot, adminport);
System.out.println("Changed the Administration Console context path to " +
"secureConsoleContext");
}

/**
* ----------------------------------------------------------
* Method to activate edits.
* ----------------------------------------------------------
*/
public ObjectName activate() throws Exception {
// Get the object name for ConfigurationManagerMBean.
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");
// Instruct MBeanServerConnection to invoke
// ConfigurationManager.activate(long timeout).
// The activate operation returns an ActivationTaskMBean.
// You can use the ActivationTaskMBean to track the progress
// of activating changes in the domain.
ObjectName task = (ObjectName) connection.invoke(cfgMgr, "activate",
new Object[] { new Long(120000) }, new String[] { "java.lang.Long" });
return task;
}

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

EditWLSMBeans ewb = new EditWLSMBeans();

// Initialize a connection with the MBean server.
initConnection(hostname, portString, username, password);

// Get an object name for the Configuration Manager.
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");

// Start an edit session.
ObjectName cfgRoot = ewb.startEditSession();
// Edit the server log MBeans.
ewb.editConsoleContextPath(cfgRoot);

// Save and activate.
connection.invoke(cfgMgr, "save", null, null);
ewb.activate();

// Close the connection with the MBean server.
connector.close();
}
}

編集操作によってスローされる例外の型

表5-1では、編集操作中にWebLogic Serverがスローする可能性があるすべての例外の型について説明します。WebLogic Serverがこのような例外をスローすると、MBeanサーバーはjavax.management.MBeanExceptionで例外をラップします。(Java SE 7 API仕様のMBeanException (http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanException.html)を参照してください。)

表5-1 編集操作によってスローされる例外の型

例外の型

スローされる場合

EditTimedOutException

編集セッションを開始するリクエストがタイムアウトした場合。

NotEditorException

ロックを取得せずにMBeanを編集しようとした場合、または、管理ユーザーが現在のロックを取り消して編集セッションを開始する場合。

ValidationException

MBean属性の値を、誤ったデータ型、許容される範囲外の値、指定された値ではない値、他の属性との依存関係に適合しない値などに設定した場合。

変更の表示と取消し

以下の節では、編集セッション中に行った変更の操作について説明します。

- 保存されていない変更の表示

- アクティブ化されていない変更の表示

- 現在のアクティブ化タスクにある変更の表示

- 変更の取消し

WebLogic Serverはjavax.management.openmbean.CompositeType型のChangeオブジェクトに変更を記述します。Java SE 7 API仕様のCompositeType (http://docs.oracle.com/javase/7/docs/api/javax/management/openmbean/CompositeType.html)を参照してください。

JMXを通じて、現在のサーバー・セッション中にのみ発生したドメインの構成の変更に関する情報にアクセスできます。WebLogic Serverは構成ファイルのアーカイブを保持しますが、JMXを通じてアーカイブされたデータを利用したり、アーカイブのバージョンを比較したりはできません。

保存されていない変更の表示

MBean属性を変更するたびに、WebLogic Serverはその変更に関する情報が含まれるChangeオブジェクトを作成します。変更を保存するまでは、これらのオブジェクトにConfigurationManagerMBean Changes属性からアクセスできます。Oracle WebLogic Server MBeanリファレンスのConfigurationManagerMBeanに関する項を参照してください。

編集セッションを終了するときに、保存されていない変更は破棄されます。

保存されていない変更を表示するには、次の手順に従います。

1. 編集セッションを開始して、少なくとも1つのMBean属性を変更します。

2. ConfigurationManagerMBean Changes属性の値を取得して、その出力をObject[]型の変数に割り当てます。

3. 配列内のオブジェクトごとにObject.toString()を呼び出して、変更の説明を出力します。
Changeはjavax.management.openmbean.CompositeTypeなので、配列内の各項目をCompositeTypeとしてキャストし、変更に対してCompositeTypeのメソッドを呼び出すこともできます。Java SE 7 API仕様のCompositeType (http://docs.oracle.com/javase/7/docs/api/javax/management/openmbean/CompositeType.html)を参照してください。

例5-2のコードでは、保存されていない変更を表示するメソッドを作成します。呼出し側メソッドは編集MBeanサーバーとの接続をすでに確立しているものとします。

例5-2 保存されていない変更を表示するサンプル・メソッド

public void listUnsaved() throws Exception {
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");
Object[] list = (Object[])connection.getAttribute(cfgMgr, "Changes");
int length = (int) list.length;
for (int i = 0; i < length; i++) {
System.out.println("Unsaved change: " + list[i].toString());
}
}

アクティブ化されていない変更の表示

変更が保存されると、WebLogic Serverは保留中の構成ファイルで変更を永続化します。編集セッションを開始したユーザーがConfigurationManagerMBean undoUnactivatedChanges()操作(アクティブ化されていない変更を保留中ファイルから元に戻す)を呼び出さない限り、複数の編集セッションにわたる場合でも、変更は保留中の構成ファイルに保持されます。

ConfigurationManagerMBean UnactivatedChanges属性には、保存されていない変更と、保存されてまだアクティブ化されていない変更の両方のChangeオブジェクトが格納されます。(保存されてまだアクティブ化されていない変更のみを格納する属性はありません。)Oracle WebLogic Server MBeanリファレンスのConfigurationManagerMBeanのアクティブ化されていない変更に関する項を参照してください。

現在の編集セッション中に保存してまだアクティブ化していない変更、または以前の編集セッションで保存されてまだアクティブ化されていない変更を表示するには、次の手順に従います。

1. 編集セッションを開始して、少なくとも1つのMBean属性を変更します。

2. ConfigurationManagerMBean UnactivatedChanges属性の値を取得して、その出力をObject[]型の変数に割り当てます。

3. 配列内のオブジェクトごとにObject.toString()を呼び出して、変更の説明を出力します。
Changeはjavax.management.openmbean.CompositeTypeなので、配列内の各項目をCompositeTypeとしてキャストし、変更に対してCompositeTypeのメソッドを呼び出すこともできます。Java SE 7 API仕様のCompositeType (http://docs.oracle.com/javase/7/docs/api/javax/management/openmbean/CompositeType.html)を参照してください。

例5-3のコードでは、アクティブ化されていない変更を表示するメソッドを作成します。呼出し側メソッドは編集MBeanサーバーとの接続をすでに確立しているものとします。

例5-3 アクティブ化されていない変更を表示するサンプル・メソッド

public void listUnactivated() throws Exception {
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");
Object[] list = (Object[])connection.getAttribute(cfgMgr,
"UnactivatedChanges");
int length = (int) list.length;
for (int i = 0; i < length; i++) {
System.out.println("Unactivated changes: " + list[i].toString());
}
}

現在のアクティブ化タスクにある変更の表示

変更をアクティブ化すると、WebLogic ServerはActivationTaskMBeanのインスタンスを作成します。このインスタンスには、アクティブ化される変更ごとに1つのChangeオブジェクトが格納されます。このActivationTaskMBeanには、次のいずれかからアクセスできます。

- ConfigurationManagerMBean activate()メソッド - 現在のアクティブ化タスクを表すActivationTaskMBeanのオブジェクト名を返します。

- ConfigurationManagerMBean CompletedActivationTasks属性 - 現在の管理サーバーのインスタンス化中に作成されたすべてのActivationTaskMBeanインスタンスのリストが含まれている可能性があります。「メモリーに格納されているすべてのアクティブ化タスクの表示」を参照してください。

現在のアクティブ化タスクにある変更のみを表示するには、次の手順に従います。

1. 編集セッションの開始

2. activate操作の出力をjavax.management.ObjectName型のインスタンス変数に割り当てます。

3. ActivationTaskMBean Changes属性の値を取得して、その出力をObject[]型の変数に割り当てます。

4. 配列内のオブジェクトごとにObject.toString()を呼び出して、変更の説明を出力します。
Changeはjavax.management.openmbean.CompositeTypeなので、配列内の各項目をCompositeTypeとしてキャストし、変更に対してCompositeTypeのメソッドを呼び出すこともできます。Java SE 7 API仕様のCompositeType (http://docs.oracle.com/javase/7/docs/api/javax/management/openmbean/CompositeType.html)を参照してください。

例5-4のコードでは、現在の編集セッションでアクティブ化されたすべての変更を表示するメソッドを作成します。呼出し側メソッドは編集MBeanサーバーとの接続をすでに確立しているものとします。

例5-4 現在のアクティブ化タスクにある変更を表示するサンプル・メソッド

public void activateAndList()
throws Exception {
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");
ObjectName task = (ObjectName) connection.invoke(cfgMgr, "activate",
new Object[] { new Long(120000) }, new String[] { "java.lang.Long" });
Object[] changes = (Object[])connection.getAttribute(task, "Changes");
int i = (int) changes.length;
for (int i = 0; i< i; i++) {
System.out.println("Changes activated: " + changes[i].toString());
}
}

変更の取消し

ConfigurationManagerMBeanには、編集セッション中に行われた変更を取り消すための2つの操作があります。

- undo
保存されていない変更を元に戻します。

- undoUnactivatedChanges
保存されているかどうかに関わらず、まだアクティブ化されていないすべての変更を元に戻します。以前の編集セッションで他のユーザーが変更を保存して、その変更をアクティブ化していない場合に、ConfigurationManagerMBean undoUnactivatedChanges()操作を呼び出すと、それらの変更も元に戻されます。

このメソッドを呼び出した後、保留中の構成ファイルは、アクティブなサーバーが使用している動作中の構成ファイルと同じになります。

変更を取り消すには、編集セッションを開始して、ConfigurationManagerMBean undoまたはundoUnactivatedChanges操作を呼び出します。

例:

connection.invoke(cfgMgr, "undo", null, null);

変更のアクティブ化の追跡

activate操作を呼び出すときにWebLogic Serverが作成する各ActivationTaskMBeanでは、変更のリストを保持する他に、変更をアクティブ化したユーザー、アクティブ化タスクのステータス、変更がアクティブ化された時刻が記述されます。

管理サーバーはActivationTaskMBeanのインスタンスをメモリー内にのみ保持します。つまり、インスタンスは永続化されず、管理サーバーを停止するときに破棄されます。ActivationTaskMBeanインスタンスにはChangeオブジェクトのリスト(各オブジェクトはMBean属性の1つの変更を表す)が含まれているため、メモリーを大量に使用します。メモリーを節約するため、デフォルトでは、管理サーバーはごく最近のActivationTaskMBeanインスタンスしかメモリー内に保持しません。デフォルトを変更するには、ConfigurationManagerMBean CompletedActivationTasksCount属性の値を増やします。

以下の節では、ActivationTaskMBeanのインスタンスの操作について説明します。

- 現在のアクティブ化タスクのステータスの表示

- メモリーに格納されているすべてのアクティブ化タスクの表示

- 完了したアクティブ化タスクのメモリーからのパージ

現在のアクティブ化タスクのステータスの表示

activate操作を呼び出すと、WebLogic Serverはアクティブ化タスクを表現するActivationTaskMBeanインスタンスを返します。

ActivationTaskMBean State属性は、アクティブ化タスクのステータスを表します。この属性にはint値が格納され、ActivationTaskMBeanは各int値の定数を定義します。Oracle WebLogic Server MBeanリファレンスのActivationTaskMBeanに関する項を参照してください。

現在のアクティブ化タスクのステータスを表示するには、次の手順に従います。

1. 編集セッションを開始して、少なくとも1つのMBean属性を変更します。

2. ConfigurationManagerMBean activate(long timeout)操作を呼び出して、その出力をActivationTaskMBean型の変数に割り当てます。

3. ActivationTaskMBean State属性の値を取得します。

メモリーに格納されているすべてのアクティブ化タスクの表示

activate操作が返すActivationTaskMBeanは1つのアクティブ化タスクのみを表します。管理サーバーは、ユーザーがパージするまでこのActivationTaskMBeanをメモリー内に保持します(「完了したアクティブ化タスクのメモリーからのパージ」を参照)。パージしないと、アクティブ化タスクの数はConfigurationManagerMBean CompletedActivationTasksCount属性の値を超えます。

現在メモリーに格納されているすべてのActivationTaskMBeanインスタンスにアクセスするには、次の手順に従います(例5-5を参照してください)。

1. 編集MBeanサーバーに接続します。(編集セッションを開始する必要はありません。)

2. ConfigurationManagerMBean CompletedActivationTasks属性の値を取得して、その出力をObject[]型の変数に割り当てます。

3. (オプション)配列内のオブジェクトごとに、ActivationTaskMBeanの属性(UserやStateなど)の値を取得して出力します。
Oracle WebLogic Server MBeanリファレンスのActivationTaskMBeanに関する項を参照してください。

4. (オプション)配列内のオブジェクトごとに、Changes属性の値を取得します。Object.toString()を呼び出して、Changeオブジェクトの値を出力します。

例5-5 メモリー内のすべてのアクティブ化タスクを表示するサンプル・メソッド

public void listActivated() throws Exception {
ObjectName cfgMgr = (ObjectName) connection.getAttribute(service,
"ConfigurationManager");
ObjectName[] list = (ObjectName[])connection.getAttribute(cfgMgr,
"CompletedActivationTasks");
System.out.println("Listing completed activation tasks.");
int length = (int) list.length;
for (int i = 0; i < length; i++) {
System.out.println("Activation task " + i);
System.out.println("User who started activation: " +
connection.getAttribute(list[i], "User"));
System.out.println("Task state: " + connection.getAttribute(list[i],
"State"));
System.out.println("Start time: " + connection.getAttribute(list[i],
"StartTime"));

Object[] changes = (Object[])connection.getAttribute(list[i], "Changes");
int l = (int) changes.length;
for (int y = 0; y < l; y++) {
System.out.println("Changes activated: " + changes[y].toString());
}
}
}

完了したアクティブ化タスクのメモリーからのパージ

ActivationTaskMBeanインスタンスにはChangeオブジェクトのリスト(各オブジェクトはMBean属性の1つの変更を表す)が含まれているため、メモリーを大量に使用します。

管理サーバーでメモリー不足になった場合は、完了したアクティブ化タスクをメモリーからパージできます。その後でConfigurationManagerMBean CompletedActivationTasksCount属性の値を減らします。

完了したアクティブ化タスクをメモリーからパージするには、編集MBeanサーバーに接続して、ConfigurationManagerMBean purgeCompletedActivationTasks操作を呼び出します。

例:

connection.invoke(cfgMgr, "purgeCompletedActivationTasks", null, null);

ロックの管理

変更によって保留中の構成MBean階層が矛盾した状態にならないように、一度に1人のユーザーだけがMBeanを編集できます。ユーザーがConfigurationManagerMBean startEdit操作を呼び出すと、ConfigurationManagerMBeanは他のユーザーが編集セッションを開始できないように(ロック)します。

以下のアクションによってロックが解除されます。

- ConfigurationManagerMBean activate操作が成功するか、タイムアウトします。
ActivationTaskMBean waitForTaskCompletion操作を使用すると、アクティブ化プロセスが完了するまでブロックできます。

- ConfigurationManagerMBean stopEdit操作が成功します。

- 他のユーザーがロックを取得しているときに、管理者権限を持つユーザーがConfigurationManagerMBean cancelEdit操作を呼び出します。
たとえば、connection.invoke(cfgMgr, "cancelEdit", null, null);

- あるユーザーIDにより編集セッションが開始され、別のプロセスが同じユーザーIDで編集セッションを開始します。
たとえば、WebLogic Server管理コンソールを使用して編集セッションを開始し、その後でWebLogic Scripting Tool (WLST)を使用して同じユーザーIDで編集セッションを開始することができます。WLSTのセッションによってWebLogic Server管理コンソールのセッションのロックは解除されます。

別のプロセスが同じユーザーIDで編集セッションを開始しないようにするには、startEdit操作にbooleanの値trueを渡して、排他的なロックを取得します。Oracle WebLogic Server MBeanリファレンスのstartEdit(waitTimeInMillis, timeOutInMillis, exclusive)に関する項を参照してください。

ロックが解除されると、保存されていないすべての変更は失われます。

ベスト・プラクティス:編集と例外処理の推奨パターン

編集するコードを複数のtry-catchブロックに整理することをお薦めします。そのようにすると、特定の型のエラーを捕捉して適切に対応できます。たとえば、編集が無効な場合に編集セッション全体を破棄するのではなく、その変更を保存して、例外をスローし、無効な変更をアクティブ化せずに終了することができます。

JMXエージェントはすべての例外をjavax.management.MBeanException型の汎用的な例外でラップします。JMXクライアントはMBeanException.getTargetException()を使用して、ラップされた例外のラップを解除することができます。

以下のような構成を利用することを検討してください(例5-6の擬似コードを参照してください) 。

- 編集MBeanサーバーに接続し、編集セッションを開始し、変更を行って保存するtryブロック。
このtryブロックの後、MBeanException内にラップされた以下の型の例外ごとに1つのcatchブロック。

- EditTimedOutException
ConfigurationManagerMBean startEdit()操作が指定された時間内にロックを取得できない場合、この例外がスローされます。

- NotEditorException
編集セッションがタイムアウトするか、管理者がユーザーの編集セッションを取り消した場合、この例外がスローされます(「ロックの管理」を参照してください。)

- ValidationException
誤ったデータ型、許容される範囲外の値、指定された値ではない値、他の属性との依存関係に適合しない値などをMBeanに設定した場合、この例外がスローされます。

ValidationExceptionを処理するコードの内部には、検証エラーを修正する、またはConfigurationManagerMBean stopEdit()操作を呼び出して編集セッションを停止するtryブロックを入れます。tryブロックで編集セッションを停止する場合、そのcatchブロックではNotEditorExceptionを無視する必要があります。この例外は、保留中の構成MBean階層でのロックを失ったことを表しますが、ここでは変更を破棄してロックを解放しようとしているので、この例外がスローされてもエラー状態ではありません。

- 保存された変更をアクティブ化するtryブロック。
ConfigurationManager activate(long timeout)操作はActivationTaskMBeanのインスタンスを返します。このインスタンスには、アクティブ化タスクに関する情報が格納されています。activate()のタイムアウト期間を1分間に設定して、その後でActivationTaskMBean State属性の値をチェックすることをお薦めします。

Stateに定数STATE_COMMITTEDが含まれている場合、変更はドメインで正常にアクティブ化されたことになります。この時点でreturn文を使用して編集作業を終了できます。アクティブ化タスクが成功すると、startEdit()で作成したロックが解放されます。

Stateに別の値が含まれている場合、アクティブ化はactivate(long timeout)で指定したタイムアウト期間中に成功しなかったことになります。ActivationTaskMBean Error属性の値を取得すると原因を見つけられます。

このtryブロックの後、ラップされた以下の型の例外を捕捉する1つのcatchブロック。

NotEditorException

変更をアクティブ化するときにこの例外がスローされた場合は、編集セッションがタイムアウトしたか管理者によって取り消されたために、変更はアクティブ化されません。

- (オプション)保存された変更を取り消すtryブロック。
クラスがアクティブ化のtryブロックで終了(return)しない場合、アクティブ化タスクは成功しなかったことになります。保存されている変更が、将来の試行でアクティブ化されないようにするには、ConfigurationManagerMBean undoUnactivatedChanges()操作を呼び出します。

そうしない場合、保存されている変更は保留中の構成ファイルに保持されます。次回、あるユーザーが保存した変更をアクティブ化しようとすると、WebLogic Serverはそのユーザーが保存した変更と一緒に、保存されている変更をアクティブ化しようとします。

このtryブロックの後、ラップされた以下の型の例外を無視する1つのcatchブロック。

NotEditorException

- 編集セッションを停止するtryブロック。
アクティブ化タスクが失敗した場合に変更を破棄する場合は、元のタイムアウト期間が経過するのを待つ必要はありません。編集を直ちに停止できます。

このtryブロックの後、以下の型の例外を無視する1つのcatchブロック。

NotEditorException

- ActivationTaskMBean Error属性に格納されている例外をスローします。

例5-6 編集と例外処理のコードの概要

try {
//Initialize the connection and start the edit session
...
ObjectName domainConfigRoot = (ObjectName) connection.invoke(cfgMgr,
"startEdit",
new Object[] { new Integer(30000), new Integer(300000) },
new String[] { "java.lang.Integer", "java.lang.Integer" });

// Modify the domain
...
// Save your changes
connection.invoke(cfgMgr, "save", null, null);

} catch (MBeanException e) {
Exception targetException = e.getTargetException();
if (targetException instanceof EditTimedOutException) {
// Could not get the lock. Notify user
...
throw new MyAppCouldNotStartEditException(e);
}
if (targetException instanceof NotEditorException) {
...
throw new MyAppEditSessionFailed(e);
}
if (targetException instanceof ValidationException) {
...
try {
connection.invoke(cfgMgr, "stopEdit", null, null);
// A wrapped NotEditorException here indicates that you no longer have a
// lock on the pending configuration MBean hierarchy; however,
// because you want to abandon changes and release your lock anyway,
// it is not an error condition for this exception to be thrown
// and you can safely ignore it.
} catch (MBeanException e) {
Exception targetException = e.getTargetException();
if (targetException instanceof NotEditorException) {
//ignore
}
}
throw new MyAppEditChangesInvalid(e);
}
else {
throw MBeanException (e);
}
}

// Changes have been saved, now activate them
try {
// Activate the changes
ActivationTaskMBean task = (ObjectName) connection.invoke(cfgMgr,
"activate",
new Object[] { new Long(60000) },
new String[] { "java.lang.Long" });
// Everything worked, just return.
String status = (String) connection.getAttribute(task, "State");
if (status.equals("4"))
return;
// If there is an activation error, use ActivationTaskMBean.getError
// to get information about the error
failure = connection.getAttribute(task, "Error");
// If you catch a wrapped NotEditorException, your changes were not activated
// because your edit session ended or was cancelled by an administrator.
// Throw the wrapped exception.
} catch (MBeanException e) {
Exception targetException = e.getTargetException();
if (targetException instanceof NotEditorException) {
...
throw new MyAppEditSessionFailed(e);
}
}

// If your class executes the remaining lines, it is because activating your
// saved changes failed.
// Optional: You can undo the saved changes that failed to activate. If you
// do not undo your saved changes, they will be activated the next time
// someone attempts to activate changes.
// try {
//     {
//      connection.invoke(cfgMgr, "undoUnactivatedChanges", null, null);
// catch(MBeanException e) {
//   Exception targetException = e.getTargetException();
//   if (targetException instanceof NotEditorException) {
//      ...
//      throw new MyAppEditSessionFailed(e);
//   }
// }

// Stop the edit session
try {
connection.invoke(cfgMgr, "stopEdit", null, null);
// If your activation attempt fails and you are ready to abandon
// changes, there is no need to wait until your original timeout
// period to expire. You can stop editing immediately
// and you can safely ignore any wrapped NotEditorException.
} catch (MBeanException e) {
Exception targetException = e.getTargetException();
if (targetException instanceof NotEditorException) {
//ignore
}
}
...
// Output the information about the error that caused the activation to
// fail.
throw new MyAppEditSessionFailed(connection.getAttribute(task, "Error"));

暗号化された値の設定と取得

権限のないアクセスからパスワードなどの重要なデータを保護するために、WebLogic Server構成MBeanのいくつかの属性は暗号化されます。そうした属性の値はドメインのconfig.xmlファイルに暗号化された文字列として保持され、メモリー内の値は暗号化されたバイト配列として表されます。暗号化されている属性は、名前がEncryptedで終わります。たとえばServerMBeanでは、IIOPプロトコルを介したアクセスの保護に使用されるパスワードがDefaultIIOPPasswordEncryptedという名前の属性として公開されます。後方互換性をサポートし、リモートのJMXクライアントがWebLogic Server MBeanのパスワードを設定できるようにするため、暗号化される各属性では、値を暗号化して設定するための、安全性がやや低い手段を提供しています。

以下の節では、暗号化された属性の扱い方について説明します。

- 暗号化された属性の値の設定(推奨技術)

- 暗号化された属性の値の設定(互換性のある技術)

- 暗号化された値のバックアップ

暗号化された属性の値の設定(推奨技術)

この方法を使用するには、(例5-7を参照してください) 。

1. MBean属性をホストしている同じWebLogic Server JVMで、バイト配列に値を書き込みます。

2. バイト配列をweblogic.management.EncryptionHelper.encrypt( byte[])メソッドに渡し、その戻り値をMBeanServerConnection.setAttributeメソッドに渡します。
暗号化された配列を変数には割り当てないでください。変数に割り当てると、ガベージ・コレクションが行われてメモリーが再割当てされるまで、暗号化されていないバイト配列がメモリー内に保持されます。

3. weblogic.management.EncryptionHelper.clear()メソッドを使用して、元のバイト配列を消去します。

例5-7 例:暗号化された属性の値の設定(推奨技術)

public void editDefaultIIOPPassword(ObjectName cfgRoot) throws Exception {
// Get the ServerMBean from the DomainMBean
ObjectName server = (ObjectName) connection.invoke(cfgRoot,
"lookupServer", new Object[] { "myserver" },
new String[] { "java.lang.String" });
// Get new password from standard in. Assign it to a byte array.
System.out.println("Enter new password and press enter: ");
byte userinput[] = new byte[10];
System.in.read(userinput);
// Encrypt the byte array and set it as the encrypted
// attribute value.
Attribute newpassword = new Attribute("DefaultIIOPPasswordEncrypted",
weblogic.management.EncryptionHelper.encrypt(userinput));
connection.setAttribute(server, newpassword);
System.out.println("New password is set to: " +
connection.getAttribute(server, "DefaultIIOPPasswordEncrypted"));
// Clear the byte array.
weblogic.management.EncryptionHelper.clear(userinput);
}

暗号化された属性の値の設定(互換性のある技術)

9.0より前では、JMXクライアントは暗号化された値を設定するための別の方法を使用していました。JMXクライアントはこの互換性のある方法を引続き使用できます。また、リモートJMXクライアントから暗号化された値を設定する場合は、この方法のみを使用できます。互換性のある方法では、暗号化されていないパスワードを格納するStringを作成するので、安全性が低くなります。WebLogic ServerがStringを暗号化されたバイト配列に変換しても、ガベージ・コレクションが行われてメモリーが再割当てされるまで、Stringはメモリー内に残ります。

互換性のある方法を使用するには、次の手順に従います。

1. 値をStringに書き込みます。

2. StringをパラメータとしてMBeanServerConnection.setAttributeメソッドに渡します。ただし、暗号化された属性の値を設定するかわりに、対応する暗号化されていない属性の値を設定します。
WebLogic ServerはStringを暗号化されたバイト配列に変換し、それをCustomIdentityKeyStorePassPhraseEncryptedとして設定します(CustomIdentityKeyStorePassPhraseの値は設定しません)。

たとえば、リモートJMXクライアントからCustomIdentityKeyStorePassPhraseEncryptedを設定するには、CustomIdentityKeyStorePassPhraseという属性に対してMBeanServerConnection.setAttributeを呼び出します。

例:

public void editDefaultIIOPPassword(ObjectName cfgRoot, String password)
throws Exception {
// Get the ServerMBean from the DomainMBean
ObjectName server = (ObjectName) connection.invoke(cfgRoot, "lookupServer",
new Object[]{"myserver"},new String[]{"java.lang.String"});
Attribute newpassword = new Attribute("DefaultIIOPPassword",
"mypassword");
connection.setAttribute(server, newpassword);
}

暗号化された値のバックアップ

パスワードのバックアップ・コピーを作成するには、MBeanの暗号化された値のゲッター・メソッドを使用して、暗号化されたバイト配列を取得します。次に、バイト配列の値をファイルに書き込みます。WebLogic Serverでは、暗号化されている値を復号化するAPIまたは他のユーティリティは提供していません。

パスワードの値を回復する必要がある場合は、保存した値をバイト配列に読み込んで、それをパラメータとしてMBeanServerConnection.setAttributeメソッドに渡すことができます(「暗号化された属性の値の設定(推奨技術)」を参照してください) 。

注意:
WebLogic Serverドメインでは独自の暗号化アルゴリズムを使用しているため、パスワードの暗号化されていない値がすべてのドメインで同じ場合でも、ドメインごとに別々にパスワードをバックアップして回復する必要があります。
各ドメインで暗号化された同じパスワードをバックアップするかわりに、MBeanの対応する暗号化されていない値のゲッター・メソッドを使用できます。このゲッターはパスワードを復号化してStringにコピーします。ガベージ・コレクションが行われてメモリーが再割当てされるまで、Stringはメモリーから消去されません。

6 JMXを使用したセキュリティ・レルムの管理

この章では、JMXを使用してセキュリティ・レルムを管理する方法について説明します。セキュリティ・レルムは、WebLogicリソースを保護する複数のメカニズムで構成されています。各セキュリティ・レルムは、構成された一連のセキュリティ・プロバイダから成ります。セキュリティ・プロバイダは、セキュリティの特定の側面を扱うモジュール形式のコンポーネントです。レルム内のプロバイダを使用するJMXクライアントを作成して、ユーザーやグループなどのセキュリティ・データを追加または削除できます。プロバイダを追加または削除したり、レルム構成にその他の変更を加えたりするクライアントを作成することもできます。

この章の内容は以下のとおりです。

- セキュリティMBeanの階層の理解

- セキュリティ・レルムを管理するMBeanサーバーの選択

- 既存のセキュリティ・プロバイダの操作

- レルム構成の変更

WebLogicセキュリティの詳細は、『Oracle WebLogic Serverセキュリティの理解』を参照してください。

セキュリティMBeanの階層の理解

他のサブシステムと同様に、WebLogic Serverセキュリティ・フレームワークではMBeanを1つの階層にまとめます。JMXクライアントはJMXオブジェクト名を作成せずに、その階層内を移動できます。ただし、セキュリティ・レルムで使用できるMBeanタイプは、レルムにインストールされたセキュリティ・プロバイダによって異なり、各セキュリティ・プロバイダで利用できるサービスは、プロバイダの作成方法によって異なります。

セキュリティ・レルム階層のルートはRealmMBeanです。ルートには、そのレルムで構成されたすべてのプロバイダが含まれています。たとえば、Authorizers属性には、レルムで構成されているすべての認可プロバイダが含まれています。WebLogic Serverにはデフォルトのセキュリティ・プロバイダが用意されているので、RealmMBeanのAuthorizers属性にはデフォルトでDefaultAuthorizerMBeanが含まれています。ただし、これらのデフォルト・プロバイダをアンインストールし、任意の数の独自のプロバイダまたはサード・パーティのプロバイダで置き換えることができます。デフォルトのセキュリティ・プロバイダについては、『Oracle WebLogic Serverセキュリティの管理 12c (12.2.1)』のWebLogicセキュリティ・プロバイダの構成に関する項および認可プロバイダの構成に関する項を参照してください。

基本プロバイダ・タイプと混合インタフェース

各セキュリティ・プロバイダでは基本プロバイダ・タイプを拡張する必要があります。たとえば、DefaultAuthorizerMBeanはAuthorizerMBeanを拡張しており、カスタムまたはサード・パーティの認可プロバイダもAuthorizerMBeanを拡張します。JMXクライアントがRealmMBean Authorizers属性の値を取得する場合、MBeanサーバーはAuthorizerMBeanを拡張しているレルム内のすべてのMBeanを返します。JMXクライアントはプロバイダのリストを反復処理して、Name属性の値や他の条件に基づいてプロバイダを選択できます。

オプショナル混合インタフェースを拡張して、基本プロバイダ・タイプの機能を強化することができます。たとえば、認証プロバイダでUserEditorMBeanを拡張すると、プロバイダはレルムにユーザーを追加できるようになります。

セキュリティMBean

WebLogic ServerのセキュリティMBeanはセキュリティ・レルム内のセキュリティ・プロバイダを構成します。以下の表では、様々なセキュリティ・プロバイダを構成するMBeanについて説明します。

- 表6-1では、認証セキュリティ・プロバイダを構成するMBeanと、認証プロバイダで拡張する必要のある抽象MBeanクラスについて説明します。この表のMBeanに加えて、WebLogic Serverには即時利用可能な認証プロバイダごとの構成MBeanが含まれています。

- 表6-2では、認証セキュリティ・プロバイダ以外のセキュリティ・プロバイダを構成するMBeanについて説明します。

- 表6-3では、セキュリティ・プロバイダが管理用にユーティリティとしてサポートできる、オプショナルMBean混合インタフェースについて説明します。

WebLogicセキュリティ・プロバイダの構成の詳細は、『Oracle WebLogic Serverセキュリティの管理 12c (12.2.1)』のWebLogicセキュリティ・プロバイダの構成に関する項および認可プロバイダの構成に関する項を参照してください。図6-1では、構成MBean階層内のMBeanの位置を示します。

表6-1 認証セキュリティ・プロバイダのMBean

MBean

構成する対象

AuthenticationProviderMBean

認証プロバイダを管理するすべてのMBean実装の基本MBean。認証プロバイダでWebLogicセキュリティSSPIを使用してログイン・サービスを提供する場合、そのMBeanはweblogic.management.security.authentication.Authenticatorを拡張する必要があります。認証プロバイダでWebLogicセキュリティSSPIを使用してIDアサーション・サービスを提供する場合、そのMBeanはweblogic.management.security.authentication.IdentityAsserterを拡張する必要があります。

Oracle WebLogic Server MBeanリファレンスのAuthenticationProviderMBeanに関する項を参照してください。

AuthenticatorMBean

ログイン・サービスを備えたすべての認証プロバイダが拡張する必要のあるSSPI MBean。このMBeanには、ログイン・シーケンスにおける認証プロバイダの位置付け(REQUIRED、REQUISITE、SUFFICENT、またはOPTIONAL)を決定するControlFlagがあります。

Oracle WebLogic Server MBeanリファレンスのAuthenticatorMBeanに関する項を参照してください。

IdentityAsserterMBean

すべてのIDアサーション・プロバイダが拡張する必要のあるSSPI MBean。このMBeanを利用すると、IDアサーション・プロバイダは、IDアサーションが可能なトークン・タイプを指定できるようになります。

Oracle WebLogic Server MBeanリファレンスのIdentityAsserterMBeanに関する項を参照してください。

ServletAuthenticationFilterMBean

すべてのサーブレット認証フィルタが拡張する必要のあるSSPI MBean。このMBeanは単なるマーカー・インタフェース。メソッドは持ちません。

Oracle WebLogic Server MBeanリファレンスのServletAuthenticationFilterMBeanに関する項を参照してください。

表6-2 他のセキュリティ・プロバイダのMBean

MBean

構成する対象

AdjudicatorMBean

すべての裁決プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのAdjudicatorMBeanに関する項を参照してください。

DefaultAdjudicatorMBean

WebLogic裁決プロバイダの構成属性。

Oracle WebLogic Server MBeanリファレンスのDefaultAdjudicatorMBeanに関する項を参照してください。

AuditorMBean

すべての監査プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのAuditorMBeanに関する項を参照してください。

DefaultAuditorMBean

WebLogic監査プロバイダの構成属性。

Oracle WebLogic Server MBeanリファレンスのDefaultAuditorMBeanに関する項を参照してください。

AuthorizerMBean

すべての認可プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのAuthorizerMBeanに関する項を参照してください。

DeployableAuthorizerMBean

WebアプリケーションまたはEJBのデプロイ時に作成されたポリシーを格納できる、すべての認可プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのDeployableAuthorizerMBeanに関する項を参照してください。

DefaultAuthorizerMBean

WebLogic認可プロバイダの構成属性。

Oracle WebLogic Server MBeanリファレンスのDefaultAuthorizerMBeanに関する項を参照してください。

CredentialMapperMBean

すべての資格証明マッピング・プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのCredentialMapperMBeanに関する項を参照してください。

DeployableCredentialMapperMBean

コンポーネントのデプロイ時に作成された資格証明マップを格納できる、すべての資格証明マッピング・プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのDeployableCredentialMapperMBeanに関する項を参照してください。

DefaultCredentialMapperMBean

WebLogic資格証明マッピング・プロバイダ(ユーザー名/パスワード資格証明マッピング・プロバイダ)の構成属性。

Oracle WebLogic Server MBeanリファレンスのDefaultCredentialMapperMBeanに関する項を参照してください。

PKICredentialMapperMBean

PKI資格証明マッピング・プロバイダ(キー・ペア資格証明マッピング・プロバイダ)の構成属性。

Oracle WebLogic Server MBeanリファレンスのPKICredentialMapperMBeanに関する項を参照してください。

SAMLCredentialMapperMBean

SAML資格証明マッピング・プロバイダ(Security Assertion Markup Language資格証明マッピング・プロバイダ)の構成属性。

Oracle WebLogic Server MBeanリファレンスのSAMLCredentialMapperMBeanに関する項を参照してください。

CertPathProviderMBean

すべての証明書パス・プロバイダの基本MBean。

Oracle WebLogic Server MBeanリファレンスのCertPathProviderMBeanに関する項を参照してください。

CertPathBuilderMBean

CertPathBuilderを備えたすべての証明書パス・プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのCertPathBuilderMBeanに関する項を参照してください。

CertPathValidatorMBean

CertPathValidatorサービスを備えたすべての証明書パス・プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのCertPathValidatorMBeanに関する項を参照してください。

CertificateRegistryMBean

証明書レジストリを構成および管理します。これはビルダーであり、検証プロバイダでもあります。目的の証明書、目的の証明書のサブジェクトDN、発行者DNとシリアル番号、およびサブジェクト・キー識別子に基づいたビルドをサポートします。

Oracle WebLogic Server MBeanリファレンスのCertificateRegistryMBeanに関する項を参照してください。

WebLogicCertPathProviderMBean

CertPathBuilderを備えたすべての証明書パス・プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのWebLogicCertPathProviderMBeanに関する項を参照してください。

RoleMapperMBean

ロール・マッピング・プロバイダの基本MBean。デプロイできないモジュールのロール・マッピング・プロバイダは、このMBeanを直接拡張する必要があります。デプロイできるモジュールのロール・マッピング・プロバイダはDeployableRoleMapperMBeanを拡張する必要があります。

Oracle WebLogic Server MBeanリファレンスのRoleMapperMBeanに関する項を参照してください。

DeployableRoleMapperMBean

WebアプリケーションまたはEJBのデプロイ時に作成されたロールを格納できる、すべてのロール・マッピング・プロバイダが拡張する必要のあるSSPI MBean。

Oracle WebLogic Server MBeanリファレンスのDeployableRoleMapperMBeanに関する項を参照してください。

DefaultRoleMapperMBean

WebLogicロール・マッピング・プロバイダの構成属性。

Oracle WebLogic Server MBeanリファレンスのDefaultRoleMapperMBeanに関する項を参照してください。

表6-3 セキュリティ・プロバイダのMBean混合インタフェース

MBean

構成する対象

ContextHandlerMBean

ContextHandlerがサポートする一連の属性を提供します。監査プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのContextHandlerMBeanに関する項を参照してください。

GroupEditorMBean

グループを作成、編集、および削除するための一連のメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのGroupEditorMBeanに関する項を参照してください。

GroupMemberListerMBean

グループのメンバーをリストするためのメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのGroupMemberListerMBeanに関する項を参照してください。

GroupMembershipHierarchyCacheMBean

グループ・メンバーシップ階層のキャッシュをサポートするのに必要な構成属性を提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのGroupMembershipHierarchyCacheMBeanに関する項を参照してください。

GroupReaderMBean

グループに関するデータを読み込むための一連のメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのGroupReaderMBeanに関する項を参照してください。

MemberGroupListerMBean

メンバーを含むグループをリストするためのメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのMemberGroupListerMBeanに関する項を参照してください。

UserEditorMBean

ユーザーを作成、編集、および削除するための一連のメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのUserEditorMBeanに関する項を参照してください。

UserLockoutManagerMBean

ユーザー・アカウントに対するロックアウトをリストおよび管理します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのUserLockoutManagerMBeanに関する項を参照してください。

UserPasswordEditorMBean

ユーザーのパスワードを変更するための2つのメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのUserPasswordEditorMBeanに関する項を参照してください。

UserReaderMBean

ユーザーに関するデータを読み込むための一連のメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのUserReaderMBeanに関する項を参照してください。

UserRemoverMBean

ユーザーを削除するためのメソッドを提供します。認証プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのUserRemoverMBeanに関する項を参照してください。

RoleEditorMBean

ロールを作成、編集、および削除するための一連のメソッドを提供します。ロール・マッピング・プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのRoleEditorMBeanに関する項を参照してください。

RoleListerMBean

ロールに関するデータをリストするための一連のメソッドを提供します。ロール・マッピング・プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのRoleListerMBeanに関する項を参照してください。

RoleReaderMBean

ロールを読み込むための一連のメソッドを提供します。ロール・マッピング・プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのRoleReaderMBeanに関する項を参照してください。

PolicyEditorMBean

ポリシーを作成、編集、および削除するための一連のメソッドを提供します。認可プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのPolicyEditorMBeanに関する項を参照してください。

PolicyListerMBean

ポリシーに関するデータをリストするための一連のメソッドを提供します。認可プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのPolicyListerMBeanに関する項を参照してください。

PolicyReaderMBean

ポリシーを読み込むための一連のメソッドを提供します。認可プロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのPolicyReaderMBeanに関する項を参照してください。

PKICredentialMapEditorMBean

ユーザー、リソースおよび資格証明アクションを、キーストア別名および対応するパスワードに一致させる資格証明マップを作成、編集、削除するための一連のメソッドを提供します。PKICredentialMappingプロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのPKICredentialMapEditorMBeanに関する項を参照してください。

PKICredentialMapReaderMBean

ユーザーおよびリソースを、キーストア別名および対応するパスワードに一致させる資格証明マップを読み込むための、一連のメソッドを提供します。その資格証明マップを使用して、構成済みのキーストアからキー情報やパブリック証明書情報を取得できます。PKICredentialMappingプロバイダMBeanはこのMBeanを必要に応じて実装できます。

Oracle WebLogic Server MBeanリファレンスのPKICredentialMapReaderMBeanに関する項を参照してください。

UserPasswordCredentialMapEditorMBean

WebLogicユーザーをリモート・ユーザー名とその対応するパスワードに一致させる資格証明マップを作成、編集、削除するための一連のメソッドを提供します。資格証明マッピング・プロバイダMBeanはこのMBeanを必要に応じて拡張できます。

Oracle WebLogic Server MBeanリファレンスのUserPasswordCredentialMapEditorMBeanに関する項を参照してください。

UserPasswordCredentialMapExtendedReaderMBean

資格証明と資格証明マッピングを読み込むための一連のメソッドを提供します。資格証明マッピングはWebLogicユーザーをリモート・ユーザー名とパスワードに一致させます。資格証明マッピング・プロバイダMBeanはこのMBeanを必要に応じて拡張できます。

Oracle WebLogic Server MBeanリファレンスのUserPasswordCredentialMapExtendedReaderMBeanに関する項を参照してください。

UserPasswordCredentialMapReaderMBean

資格証明と資格証明マッピングを読み込むための一連のメソッドを提供します。資格証明マッピングはWebLogicユーザーをリモート・ユーザー名とパスワードに一致させます。資格証明マッピング・プロバイダMBeanはこのMBeanを必要に応じて拡張できます。

Oracle WebLogic Server MBeanリファレンスのUserPasswordCredentialMapReaderMBeanに関する項を参照してください。

ImportMBean

プロバイダ固有のデータをインポートするための一連のメソッドを提供します。セキュリティ・プロバイダが拡張できるオプショナル混合インタフェース。

Oracle WebLogic Server MBeanリファレンスのImportMBeanに関する項を参照してください。

ExportMBean

プロバイダ固有のデータをエクスポートするための一連のメソッドを提供します。セキュリティ・プロバイダが拡張できるオプショナル混合インタフェース。

Oracle WebLogic Server MBeanリファレンスのExportMBeanに関する項を参照してください。

ListerMBean

リストを返すための一般的なメカニズムを提供します。派生するMBeanはこのインタフェースを拡張して、リスト内の現在のオブジェクトのデータにアクセスするメソッドを追加します。セキュリティ・プロバイダが拡張できるオプショナル混合インタフェース。

Oracle WebLogic Server MBeanリファレンスのListerMBeanに関する項を参照してください。

NameListerMBean

名前のリストを返すために使用するメソッドを定義しています。セキュリティ・プロバイダが拡張できるオプショナル混合インタフェース。

Oracle WebLogic Server MBeanリファレンスのNameListerMBeanに関する項を参照してください。

LDAPServerMBean

外部LDAPサーバーへの接続に必要な構成パラメータを取得するメソッドを提供します。セキュリティ・プロバイダが拡張できるオプショナル混合インタフェース。

Oracle WebLogic Server MBeanリファレンスのLDAPServerMBeanに関する項を参照してください。

ApplicationVersionerMBean

バージョン管理可能なアプリケーションをサポートすることを示すために、セキュリティ・プロバイダが拡張するSSPI MBean。RoleMapper、Authorizer、またはCredentialMapperプロバイダMBeanが拡張できるオプショナル混合インタフェース。

Oracle WebLogic Server MBeanリファレンスのApplicationerVersionMBeanに関する項を参照してください。

図6-1 セキュリティMBean

セキュリティ・レルムを管理するMBeanサーバーの選択

JMXを使用してセキュリティ・レルムを管理する場合は、タスクに応じて2つの異なるMBeanサーバーを使用する必要があります。

- セキュリティMBean属性の値を設定する場合は、編集MBeanサーバーを使用します。

- セキュリティ・プロバイダMBeanでユーザー、グループ、ロール、およびポリシーを追加したり、他の操作を呼び出したりする場合は、ランタイムMBeanサーバーまたはドメイン・ランタイムMBeanサーバーを使用します。
また、両立不能な変更が発生しないように、自身のクライアントや別のJMXクライアントに現在アクティブな編集セッションがある場合にはセキュリティ・プロバイダMBeanで操作を呼び出すことはできません。

たとえば、DefaultAuthenticatorMBeanのMinimumPasswordLength属性の値は、ドメインの構成ドキュメントに格納されています。このドキュメントに対するすべての変更はWebLogic Serverによって制御されているため、この属性の値を変更するには、編集MBeanサーバーを使用してドメインの構成に対してロックを取得する必要があります。DefaultAuthenticatorMBeanのcreateUser操作は、LDAPサーバーにデータを追加します。この操作はWebLogic Serverによって制御されていません。DefaultAuthenticatorMBeanの構成とそれがLDAPサーバーで使用するデータの間で両立不能な変更が発生しないように、自身や別のユーザーがMinimumPasswordLength属性の変更を行っている場合にはcreateUser操作を呼び出すことはできません。さらに、この属性の変更にはWebLogic Serverの再起動が必要になるため、サーバーが再起動するまでcreateUser操作を呼び出すことができません。

既存のセキュリティ・プロバイダの操作

セキュリティ・プロバイダでは混合インタフェースを必要に応じて拡張することができます。したがって、すべてのセキュリティ・プロバイダがすべてのタスクを行えるわけではありません。このように柔軟性があるので、組織のセキュリティ設計者はセキュリティの要件に応じてレルムを設計できます。また、JMXクライアントの設計も、各レルムの設計や構成によって異なったものになります。

たとえば、次の3種類の認証プロバイダを含むレルムがあるとします。

- 管理ユーザーをLDAPサーバーに保存するためにUserEditorMBeanを拡張した認証プロバイダ。

- 顧客をデータベース管理システムに保存するためにUserEditorMBeanを拡張した認証プロバイダ。

- UserEditorMBeanを拡張せず、既存のユーザーを認証するためにのみ使用される認証プロバイダ。

このレルムの認証プロバイダを扱うには、JMXクライアントでは、適切なリポジトリにユーザーを追加できるのはどの認証プロバイダかを判断できる必要があります。

表6-4では、タスクに適したセキュリティ・プロバイダを検索する方法について説明します。

表6-4 レルム内のプロバイダの検索

技術

説明

名前で検索する

管理者がレルムで構成するときに、各セキュリティ・プロバイダ・インスタンスには短い名前が割り当てられています。JMXクライアントは特定の種類(認証プロバイダなど)のすべてのプロバイダをルックアップして、名前に一致するプロバイダを選択できます。

この方法を使用する場合は、セキュリティ・プロバイダの名前を、JMXクライアントにハード・コード化するのではなく、構成ファイルに保存することを検討してください。構成ファイルを使用すると、システム管理者はレルム内のプロバイダを変更してプロパティ・ファイルを更新できるので、JMXクライアントを更新して再コンパイルする必要がありません。

MBeanタイプで検索する

システム管理者が常に同じ種類のプロバイダをタスクに使用する場合、JMXクライアントはその特定の種類のプロバイダMBeanを検索できます。

たとえば、システム管理者が常にSQLAuthenticatorMBeanを使用して顧客をレルムに追加する場合、JMXクライアントはSQLAuthenticatorMBeanのインスタンスを検索することができます。

この方法ではユーザー入力は必要ありませんが、次のことが前提となります。

- レルム内には常にSQLAuthenticatorMBeanのインスタンスがあり、このインスタンスはUserEditorMBeanを拡張します。

- SQLAuthenticatorMBeanの複数のインスタンスがある場合は、そのすべてがUserEditorMBeanを拡張しており、どのインスタンスを使用しても問題ありません。

「使用可能なサービスの検索」を参照。

必要な混合インタフェースを拡張したプロバイダを使用する

各プロバイダMBeanインスタンスのクラス階層を認識し、タスクに必要な混合インタフェースを拡張しているインスタンスを選択するJMXクライアントを作成できます。たとえば、クライアントではUserEditorMBeanを拡張した認証プロバイダを検索できます。「使用可能なサービスの検索」を参照。

必要な混合インタフェースを拡張したMBeanがセキュリティ・レルム内に1つしかないことが分かっている場合、またはどの方法を使用してもかまわない場合に、この方法を使用します。

使用可能なサービスの検索

タイプまたは混合インタフェースでMBeanを検索するJMXクライアントを作成するには、次の手順に従います。

1. WebLogic ServerランタイムMBeanサーバーに接続します。「MBeanサーバーへのリモート接続の作成」を参照してください。
すべてのWebLogic Serverインスタンスは独自のランタイムMBeanサーバーを保持しており、どのサーバーのランタイムMBeanサーバーにも接続できます。

2. レルム内の特定のタイプのセキュリティ・プロバイダMBean (たとえば、認証プロバイダMBean)をすべて取得します。

1. RuntimeServiceMBeanまたはDomainRuntimeServiceMBeanを使用し、WebLogic Server MBean階層を介して、次のパス順に移動します。

2. DomainMBean、SecurityConfigurationMBean、RealmMBean。
「MBeanサーバーへのリモート接続の作成」を参照してください。

3. そのセキュリティ・プロバイダ・タイプのインスタンスを含むRealmMBean属性の値を取得します。
たとえば、すべての認証プロバイダを取得するには、RealmMBean AuthenticationProviders属性の値を取得します。

3. RealmMBean属性にあるセキュリティ・プロバイダMBeanごとに、MBeanクラスの名前を取得します(例6-1を参照してください) 。

1. プロバイダMBeanのjavax.management.ModelMBeanInfoオブジェクトを取得します。
MBeanServerConnection.getMBeanInfo(Provider-MBean)を使用します。

Provider-MBeanはRealmMBeanから取得したプロバイダMBeanです。

2. MBean infoのjavax.management.Descriptorオブジェクトを取得してから、DescriptorのinterfaceClassNameフィールドの値を取得します。

4. WebLogic Server MBeanタイプ・サービスを使用して、特定の基本タイプまたは混合インタフェースを拡張するすべてのセキュリティ・プロバイダMBeanクラスを検索します(例6-1を参照してください) 。

1. 基本タイプまたは混合インタフェースの完全修飾インタフェース名を調べます。
Oracle WebLogic Server MBeanリファレンスの各項目では、WebLogic ServerプロバイダMBeanの完全修飾インタフェース名が示されています。サード・パーティのプロバイダを使用する場合は、サード・パーティのドキュメントでこの情報を参照してください。

たとえば、UserEditorMBean混合インタフェースの完全修飾インタフェース名はweblogic.management.security.authentication.UserEditorMBeanです。(Oracle WebLogic Server MBeanリファレンスのUserEditorMBeanに関する項を参照。)

2. MBeanTypeService MBeanのオブジェクト名を作成します。
MBeanTypeService MBeanは常に次のjavax.management.ObjectNameで登録されます。

com.bea:Name=MBeanTypeService,Type=weblogic.management.mbeanservers.MBeanTypeService

3. MBeanTypeService MBeanのgetSubtypes(java.lang.String beanInterface)操作を呼び出します。beanInterfaceは、手順1で特定した完全修飾インタフェース名を示します。
操作はjava.lang.Stringオブジェクトの配列を返します。

5. MBeanタイプ・サービスの出力を、各プロバイダMBeanインスタンスのクラス名と比較します(例6-1を参照してください) 。

6. プロバイダMBeanのクラスがステップ4aのインタフェースを実装または拡張している場合は、プロバイダMBeanの操作を呼び出します。

例6-1 例:プロバイダMBeanインスタンスがUserEditorMBean混合インタフェースを拡張しているかどうかの判断

ObjectName MBTservice = new ObjectName(
"com.bea:Name=MBeanTypeService,Type=weblogic.management.mbeanservers.
MBeanTypeService");

for (int p = 0; atnProviders != null && p < atnProviders.length; p++) {
ModelMBeanInfo info = (ModelMBeanInfo)
mBeanServerConnection.getMBeanInfo(atnProviders[p]);
Descriptor desc = info.getMBeanDescriptor();
String className = (String)desc.getFieldValue("interfaceClassName");
String[] mba =  (String[]) mBeanServerConnection.invoke( MBTservice,
"getSubtypes", new Object[] {
"weblogic.management.security.authentication.UserEditorMBean" },
new String[] { "java.lang.String" });
boolean isEditor = false;
for (int i = 0; i < mba.length; i++) {
if (mba[i].equals(className)){
userEditor = atnProviders[p];
isEditor = true;
break;
}
if (isEditor = true) break;
}
}

例:レルムへのユーザーの追加

例6-2のサンプル・コードでは、レルム内のすべての認証プロバイダを検索し、UserEditorMBeanを拡張している最初の認証プロバイダを使用して、ユーザーをセキュリティ・レルムに追加し、そのユーザーをAdministratorsグループに追加しています。

サンプル・コードに関する以下の点に留意してください。

- ユーザー名とパスワードは、Apache Strutsのアクションで作成されたJavaBeanから取得されます。

- セキュリティMBeanそのものの構成は変更しないので、このコードではドメインの構成をロックする必要はありません。かわりに、LDAPサーバーにセキュリティ・データを保存する、デフォルト認可プロバイダの操作を呼び出します。

例6-2 例:レルムへのユーザーの追加

public ActionForward createNewAdmin(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ClientException, Exception {
logger.info("Create New Admin");
CreateAdminBean user = (CreateAdminBean) form;
logger.debug(user.toString());

MBeanServerConnection mBeanServerConnection =
this.getDomainMBeanServerConnection(request);
ObjectName service = new
ObjectName("com.bea:Name=DomainRuntimeService,"+
"Type=weblogic.management.mbeanservers.domainruntime.
DomainRuntimeServiceMBean");
ObjectName domainMBean =
(ObjectName) mBeanServerConnection.getAttribute(service,
"DomainConfiguration");
ObjectName securityConfiguration =
(ObjectName) mBeanServerConnection.getAttribute(domainMBean,
"SecurityConfiguration");
ObjectName defaultRealm =
(ObjectName) mBeanServerConnection.
getAttribute(securityConfiguration, "DefaultRealm");
ObjectName[] atnProviders =
(ObjectName[]) mBeanServerConnection.getAttribute(defaultRealm,
"AuthenticationProviders");

ObjectName userEditor = null;
ObjectName MBTservice = new ObjectName(
"com.bea:Name=MBeanTypeService,Type=weblogic.management.mbeanservers.
MBeanTypeService");

for (int p = 0; atnProviders != null && p < atnProviders.length; p++) {
ModelMBeanInfo info = (ModelMBeanInfo)
mBeanServerConnection.getMBeanInfo(atnProviders[p]);
Descriptor desc = info.getMBeanDescriptor();
String className = (String)desc.getFieldValue("interfaceClassName");
String[] mba =  (String[]) mBeanServerConnection.invoke( MBTservice,
"getSubtypes", new Object[] {
"weblogic.management.security.authentication.UserEditorMBean" },
new String[] { "java.lang.String" });
boolean isEditor = false;
for (int i = 0; i < mba.length; i++) {
if (mba[i].equals(className)){
userEditor = atnProviders[p];
isEditor = true;
break;
}
if (isEditor = true) break;
}
}

try {
mBeanServerConnection.invoke(
userEditor, "createUser",
new Object[] {user.getUsername(), user.getPassword(),
"MedRec Admininistator"},
new String[] {"java.lang.String", "java.lang.String",
"java.lang.String"}
);
} catch (MBeanException ex) {
Exception e = ex.getTargetException();
if (e instanceof AlreadyExistsException) {
logger.info("User, " + user.getUsername() + ", already exists.");
ActionErrors errors = new ActionErrors();
errors.add("invalidUserName",
new ActionError("invalid.username.already.exists"));
saveErrors(request, errors);
return mapping.findForward("create.new.admin");
} else {
logger.debug(e);
return mapping.findForward("create.new.admin");
}
}

try {
mBeanServerConnection.invoke(
userEditor, "addMemberToGroup",
new Object[] {"Administrators", user.getUsername()},
new String [] {"java.lang.String", "java.lang.String"}
);

mBeanServerConnection.invoke(
userEditor, "addMemberToGroup",
new Object[] {"MedRecAdmins", user.getUsername()},
new String [] {"java.lang.String", "java.lang.String"}
);
} catch (MBeanException ex) {
Exception e = ex.getTargetException();
if (e instanceof NameNotFoundException) {
logger.info("Invalid Group Name.");
ex.printStackTrace();
return mapping.findForward("create.new.admin");
} else {
logger.debug(e);
return mapping.findForward("create.new.admin");
}
}
logger.info("MedRec Administrator successfully created.");
return mapping.findForward("create.new.admin.successful");
}

レルム構成の変更

セキュリティ・プロバイダMBeanは認証や認可などのセキュリティの特定の側面を扱いますが、他の2つのMBeanでは、セキュリティに関する一般的な、レルム全体およびドメイン全体の側面を扱います。

- RealmMBean - セキュリティ・レルムを表します。JMXクライアントはそれを使用して、セキュリティ・プロバイダを追加または削除します。また、WebコンテナやEJBコンテナはすべてのアクセスでセキュリティ・フレームワークを呼び出すか、またはデプロイメント記述子にセキュリティが設定されるときにのみ呼び出すかなどの動作を指定します。

- SecurityConfigurationMBean - 接続フィルタや、Webアプリケーション・コンテナ内のセキュリティ制約、サーブレット、フィルタ、仮想ホストおよび外部セキュリティ・ポリシーに対するURLパターン・マッチングの動作などの、ドメイン全体のセキュリティ設定を指定します。

これらの2つのMBeanではWebLogic Server構成ファイルにデータを永続化します。そのため、RealmMBeanまたはSecurityConfigurationMBeanの属性値を変更するには、第5章「JMXを使用したドメインの構成の管理」で説明されているように、編集MBeanサーバーとConfigurationManagerMBeanを使用する必要があります。

7 通知とモニターMBeanの使い方

この章では、JMXを使用してMBeanをモニターする方法について説明します。JMXにはMBeanをモニターする2つの方法があります。特定のイベント(属性値の変更など)が発生したときに通知を送信する方法、または、モニターMBeanという特別なタイプのMBeanが別のMBeanをポーリングして、属性値について記述した通知を定期的に送信する方法です。これらの通知をリスニングしたり、適切に応答したりするリスナーというJavaクラスを作成します。たとえば、アプリケーションのデプロイ、アンデプロイ、再デプロイ時に通知を受信するリスナーを管理ユーティリティに組み込むことができます。すべてのWebLogic Server構成MBeanと一部のランタイムMBeanは、属性値が変わると通知を送信します。

この章の内容は以下のとおりです。

- ベスト・プラクティス:直接的なリスニングとモニター

- ベスト・プラクティス: WebLogic Serverイベントのリスニング

- ベスト・プラクティス: WebLogic Serverランタイム統計のリスニングまたはモニター

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

- モニターMBeanを使用した変更の観察:主な手順

ベスト・プラクティス:直接的なリスニングとモニター

モニターするMBeanが通知を送信する場合は、MBeanにおける変更をリスニングするリスナー・オブジェクトを作成するか、MBeanを定期的にポーリングして、属性値が特定の方法で変更された場合にのみ通知を送信するモニターMBeanを作成するかを選択することができます。どちらの方法を選ぶかは、主に通知を受信する状況の複雑さによって決まります。

要件が単純な場合は、MBeanからリスナーに通知が送信され、変更が直ちに通知されるので、リスナーを直接MBeanに登録する方法が適しています。ただし、リスナーとオプショナルなフィルタ(javax.management.NotificationListenerおよびNotificationFilter)を実装するベース・クラスには、値をしきい値や他の値と比較する機能がほとんどありません(Java SE 7 API仕様のjavax.managementパッケージ(http://docs.oracle.com/javase/7/docs/api/javax/management/package-summary.html)を参照してください。)

通知の要件が複雑な場合や、MBean属性値の1つの変更に直接関連付けられない一連の変更をモニターする場合は、モニターMBeanを使用します。(Java SE 7 API仕様のjavax.management.monitorパッケージ(http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/package-summary.html)を参照してください。)モニターMBeanには、データを比較して、特定の状況でのみ通知を送信するツールが豊富に用意されています。ただし、モニターは観察対象MBeanで属性値の変更を定期的にポーリングし、変更の通知は指定したポーリング間隔でのみ受けられます。

ベスト・プラクティス: WebLogic Serverイベントのリスニング

WebLogic Server JMXエージェントとWebLogic Server MBeanは、様々なタイプのイベントに応じて様々な型の通知オブジェクトを送信します。ほとんどのイベント・タイプは複数のMBeanをトリガーして、イベント・プロセスの様々な時点で通知を送信します。表7-1では、一般的なイベント・タイプについて説明し、通知をリスニングするためにJMXモニター・アプリケーションが登録すべき推奨MBeanを示しています。

注意:
各JMX通知オブジェクトには、ドット区切りの文字列を格納するTypeという属性があります。このType属性の説明と通知のオブジェクト型を混同しないようにしてください。
Type属性によって、通知の分類やフィルタ処理を行うことができます。たとえば、カスタムMBeanが通知を送信する場合、JMXの規約では、通知オブジェクトのType属性を、mycompany.myapp.valueIncreasedという企業名で始まる文字列に設定するように薦めています。

すべてのJMX通知オブジェクトはjavax.management.Notificationオブジェクト型を拡張します。JMXとWebLogic Serverではjavax.management.AttributeChangeNotificationなどの追加の通知オブジェクト型を定義しています。追加のオブジェクト型には、様々なタイプのイベントに適した特殊な情報が含まれています。(Java SE 7 API仕様に記載されたjavax.management.NotificationのNotificationサブクラス・リスト(http://docs.oracle.com/javase/7/docs/api/javax/management/Notification.html)を参照してください。)Oracle WebLogic Server Java APIリファレンスのweblogic.management.logging.WebLogicLogNotificationに関する項も参照してください。)

表7-1 イベント通知オブジェクト

イベント

リスニングの推奨事項

WebLogic Serverインスタンスが起動する、停止する

サーバーの起動または停止時に通知を受信するには、リスナーをドメイン・ランタイムMBeanサーバー内の各サーバーのServerLifeCycleRuntimeMBeanに登録して、AttributeChangeNotificationFilterを構成します。

ドメイン内の各サーバーには独自のServerLifeCycleRuntimeMBeanがあり、そのサーバーがアクティブでない場合でも、ドメイン・ランタイムMBeanサーバーから利用できます。サーバー・インスタンスを起動すると、そのサーバーのServerLifeCycleRuntimeMBeanはState属性の値を更新して、AttributeChangeNotificationを送信します。

このようなリスナーとフィルタの例については、「WebLogic Server MBeanからの通知のリスニング: 主な手順」を参照してください。

注意: この推奨事項では、管理対象サーバーを起動する前にドメインの管理サーバーを起動することを前提としています。管理サーバーよりも前に管理対象サーバーを起動すると、管理対象サーバーのServerLifeCycleRuntimeMBeanの状態がRUNNINGに変わるときにドメインのランタイムMBeanサーバー(管理サーバー上でのみ動作する)が初期化されません。管理サーバーが最初に起動することを保証できない場合は、JMXタイマー・サービスを使用し、ドメイン・ランタイムMBeanサーバーに対して、オブジェクト名にType=ServerRuntimeキー・プロパティが含まれるMBeanがあるかどうかを定期的に問い合せます。この問合せに一致するMBeanは、各サーバー・インスタンスが起動プロセス中に作成したServerRuntimeMBeanです。新しく作成されたServerRuntimeMBeanが問合せで見つかった場合、新しいサーバー・インスタンスが起動されたことになります。MBeanServerConnection queryNamesを参照してください。(http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanServerConnection.html#queryNames%28javax.management.ObjectName,%20javax.management.QueryExp%29を参照。

WebLogic Serverリソースが作成される、破棄される

サーバーやJDBCデータ・ソースなどのリソースを作成するときに、WebLogic Serverはリソースの構成MBeanをMBeanサーバーに登録します。リソースを削除するときに、構成MBeanの登録を解除します。

Mbeanの登録と登録解除をリスニングするには、javax.management.MBeanServerDelegateにリスナーを登録します。MBeanが登録または登録解除されるとjavax.management.MBeanServerNotification

型の通知を送信します。

編集MBeanサーバー内のMBeanServerDelegateにリスナーを登録した場合は、保留中のMBean階層が変更されたときに通知を受信します。

ランタイムMBeanサーバーまたはドメイン・ランタイムMBeanサーバーでリスナーを登録した場合は、保留中の変更がドメインで正常にアクティブ化されたときにのみ通知を受信します。構成データのモニターにのみ関心があり、ランタイム統計のモニターには関心がない場合は、リスナーをランタイムMBeanサーバーにのみ登録します。「ベスト・プラクティス: MBeanサーバーの選択」を参照してください。

「例: 構成MBeanの登録のリスニング」を参照してください。

WebLogic Serverリソースの構成が変更される

すべての構成MBeanは、属性値が変わるときにAttributeChangeNotification型の通知を送信します。

この通知を受信するには、ドメイン・ランタイムMBeanサーバーまたはランタイムMBeanサーバー内のMBeanにリスナーを登録します(「ベスト・プラクティス: MBeanサーバーの選択」を参照)。

編集MBeanサーバー内のMBeanに登録した場合は、保留中のMBean階層が変更されたときに通知を受信します。

ランタイムMBeanサーバーまたはドメイン・ランタイムMBeanサーバーでリスナーを登録した場合は、保留中の変更がドメインで正常にアクティブ化されたときにのみ通知を受信します。構成データのモニターにのみ関心があり、ランタイム統計のモニターには関心がない場合は、リスナーをランタイムMBeanサーバーにのみ登録します。「ベスト・プラクティス: MBeanサーバーの選択」を参照してください。

WebLogic Serverリソースの実行時状態が変わる

一部のランタイムMBeanは、属性値が変わるとAttributeChangeNotification型の通知を送信します。この通知を受信するには、ドメイン・ランタイムMBeanサーバー内のMBeanにリスナーを登録します。

ランタイムMBeanが通知を送信しない場合は、ランタイムMBeanをポーリングするモニターMBeanを作成できます。「モニターMBeanを使用した変更の観察: 主な手順」を参照してください。

WebLogic Serverリソースがログ・メッセージを送信する

WebLogic Serverリソースがログ・メッセージを送信するとき、サーバーのweblogic.management.runtime.LogBroadcasterRuntimeMBeanはweblogic.management.logging.WebLogicLogNotification型の通知を送信します。これは、標準のjavax.management.Notificationクラスとしてキャストできます。

ログ・メッセージの通知をリスニングするには、LogBroadcasterRuntimeMBeanにリスナーを登録します。標準のJMX通知をリスニングできます。または、ログ・メッセージの詳細情報を取得する場合は、詳細情報の取得に使用できるメソッドを備えたWebLogicLogNotificationをリスニングできます。WebLogicLogNotificationをリスニングするには、このWebLogic Serverクラスをリスナー・クラスにインポートする必要があります。

WebLogic Serverリソースが生成するエラー・メッセージのリストについては、エラー・メッセージを参照してください。

詳細は、Oracle WebLogic Server Java APIリファレンスのWebLogicLogNotificationに関する項を参照してください。

ベスト・プラクティス: WebLogic Serverランタイム統計のリスニングまたはモニター

WebLogic Server MBeanは、サービスやリソースの実行時状態に関する詳細な統計を提供します。表7-2の統計は、WebLogic Serverのパフォーマンスの概要を提供するものです。これらの統計の変化をリスニングするには、リスナーを作成して、属性が含まれるMBeanにリスナーを直接登録します。または、モニターMBeanを構成して、重要だと判断した統計のみを定期的にポーリングして報告させることもできます。(「通知リスナーとフィルタの登録」および「モニターとリスナーの登録」を参照してください。)

表7-2 一般的にモニターされるWebLogic Serverランタイム統計

追跡する統計

リスニングまたはモニターするMBean属性

サーバーの現在の状態

MBeanのタイプ: ServerLifeCycleRuntimeMBean

属性名: State

サーバーのリスニング・ポートのアクティビティ

MBeanのタイプ: ServerRuntimeMBean

属性名: OpenSocketsCurrentCount

MBeanのタイプ: ServerMBean

属性名: AcceptBacklog

この2つの属性を一緒に使用して、サーバーのリスニング・ポートにおける現在のアクティビティと、ポート上でバックログできるリクエストの総数を比較します。

メモリーとスレッドの使用状況

MBeanのタイプ: ThreadPoolRuntimeMBean

属性名: ExecuteThreadIdleCount

メモリー領域を占有しているがデータの処理には使用されていない、サーバーの実行キューのスレッド数を示します。

メモリーとスレッドの使用状況

MBeanのタイプ: ThreadPoolRuntimeMBean

属性名: PendingUserRequestCount

サーバーの実行キューで待機するユーザー・リクエスト数を示します。

メモリーとスレッドの使用状況

MBeanのタイプ: JVMRuntimeMBean

属性名: HeapSizeCurrent

サーバーのJVMヒープで現在使用可能なメモリー量(バイト単位)を示します。

データベース接続

MBeanのタイプ: JDBCDataSourceRuntimeMBean

属性名: ActiveConnectionsCurrentCount

JDBC接続プールでの現在アクティブな接続数を示します。

データベース接続

MBeanのタイプ: JDBCDataSourceRuntimeMBean

属性名: ActiveConnectionsHighCount

JDBC接続プールのアクティブな接続の最大数。この数は、接続プールがインスタンス化されるたびにゼロから開始します。

データベース接続

MBeanのタイプ: JDBCDataSourceRuntimeMBean

属性名: LeakedConnectionCount

リークされた接続の総数を示します。リークされた接続はチェックアウト済みの接続ですが、close()呼出しを通じて接続プールに返されません。リークされた接続はその後の接続リクエストの遂行に使用できないので、その総数をモニターすることは重要です。

データベース接続

MBeanのタイプ: JDBCDataSourceRuntimeMBean

属性名: ConnectionDelayTime

接続プールに接続する平均時間を示します。

データベース接続

MBeanのタイプ: JDBCDataSourceRuntimeMBean

属性名: FailuresToReconnectCount

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

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

MBeanが送信する通知を直接リスニングするには、次の手順に従います。

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

2. 通知を受信するMBeanにリスナーとフィルタ(オプション)を登録する追加のクラスを作成します。「通知フィルタを構成する」および「通知リスナーとフィルタを登録する」を参照してください。

3. リスナーおよび登録クラスをパッケージ化してデプロイします。「WebLogic Serverにリスナーのパッケージ化およびデプロイ化」を参照してください。

通知リスナーの作成

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

1. javax.management.NotificationListenerを実装するクラスを作成します。
Java SE 7 API仕様のNotificationListener (http://docs.oracle.com/javase/7/docs/api/javax/management/NotificationListener.html)を参照してください。

2. クラス内にNotificationListener.handleNotification(Notification notification, java.lang.Object handback)メソッドを追加します。

注意:
通知ブロードキャスタをブロックしないように、このメソッドの実装はできるだけ早く復帰する必要があります。

3. (オプション)ほとんどの場合、MBeanが通知オブジェクトを送信したという単純な事実以上のことを知る必要があります。たとえば、通知オブジェクトのType属性の値を知ることができます。この値は、通知の送信を引き起こしたイベントのタイプを分類するのに使用します。
通知オブジェクトから情報を取得するには、handleNotificationメソッドの内部で、そのオブジェクトのメソッドを呼び出します。すべての通知型はjavax.management.Notificationを拡張しているので、Notificationの以下のメソッドはすべての通知で使用できます。

- getMessage()

- getSequenceNumber()

- getTimeStamp()

- getType()

- getUserData()

Java SE 7 API仕様のNotification (http://docs.oracle.com/javase/7/docs/api/javax/management/Notification.html)を参照してください。

ほとんどの通知型は、その通知に固有のデータを取得するための追加のメソッドを提供しています。たとえば、javax.management.AttributeChangeNotificationには、値がどのように変化したかを判断するのに使用できるgetNewValue()とgetOldValue()があります。

例7-1は、AttributeChangeNotificationのメソッドを使用して、値が変化した属性の名前と古い値および新しい値を取得する簡単なリスナーです。

例7-1 通知リスナー

import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.AttributeChangeNotification;

public class MyListener implements NotificationListener {

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

リモートJVMからのリスニング

JMX 1.2では、リスニングするMBeanとは別のJVMで動作するリスナーのプログラミングに関する特別な要件はありません。

(javax.management.MBeanServerConnectionを使用して)リモートJMXエージェントへの接続を確立すると、JMXによってJVM間のデータの共有が処理されます。リモートJVMから接続を確立する手順については、「通知リスナーとフィルタの登録」を参照してください。

ベスト・プラクティス:通知リスナーの作成

NotificationListenerクラスを作成するときに、以下の推奨事項を考慮してください。

- 通知フィルタを使用しない限り、リスナーはそのリスナーが登録されているMBeanからの(すべての通知型の)すべての通知を受信します。
MBeanから送信されるすべての通知に1つのリスナーを使用するのではなく、フィルタとリスナーを組み合せて使用するのが最適です。複数のリスナーを使用するとJVMの初期化に時間がかかりますが、そのかわりにコードの保守が容易になります。

- WebLogic Server環境にモニターする必要のあるMBeanタイプの複数のインスタンスがある場合は、1つの通知リスナーを作成して、モニターするMBeanインスタンスと同じ数だけ登録クラスを作成できます。
たとえば、WebLogic Serverドメインに3つのJDBCデータ・ソースがある場合は、AttributeChangeNotificationをリスニングする1つのリスナー・クラスを作成できます。次に、3つの登録クラスを作成します。各登録クラスは、リスナーをJDBCDataSourceRuntimeMBeanの特定のインスタンスに登録します。

- handleNotificationメソッド・シグネチャにはhandbackオブジェクトの引数が含まれていますが、リスナーではhandbackオブジェクトからデータを取得したり、handbackオブジェクトを操作したりする必要はありません。それは、リスナーがMBeanエミッタに関する情報を関連付けるのを助ける不透明なオブジェクトです。

- 通知ブロードキャスタをブロックしないように、handleNotificationメソッドの実装はできるだけ早く復帰する必要があります。

- 特殊な通知型のメソッドを呼び出す場合は、そのメソッド呼出しをif文でラップして、リスナーがすべての型の通知オブジェクトのメソッドを呼び出さないようにします。

通知フィルタの構成

JDK 1.5では、指定する条件に一致した通知を転送するように構成できる、簡単なフィルタ・クラスが2つ用意されています。JDKのフィルタ・クラスを構成するには、次の手順に従います。

1. リスナーをMBeanに登録するクラスで、javax.management.NotificationFilterSupportまたはAttributeChangeNotificationFilterのインスタンスを作成します。

2. フィルタ・クラスのメソッドを呼び出して、フィルタ条件を指定します。
Java SE 7 API仕様のNotificationFilterSupport (http://docs.oracle.com/javase/7/docs/api/javax/management/NotificationFilterSupport.html)またはAttributeChangeNotificationFilter (http://docs.oracle.com/javase/7/docs/api/javax/management/AttributeChangeNotificationFilter.html)を参照してください。

たとえば、以下のコード行では、Stateという属性で変更があった場合にのみ属性変更通知を転送するAttributeChangeNotificationFilterを構成します。

AttributeChangeNotificationFilter filter =
new AttributeChangeNotificationFilter();
filter.enableAttribute("State");

カスタム・フィルタの作成

JDKのフィルタ・クラスでは単純過ぎて要件に合わない場合は、より高度なカスタム・フィルタ・クラスを作成できます。(Java SE 7 API仕様のNotificationFilter (http://docs.oracle.com/javase/7/docs/api/javax/management/NotificationFilter.html)を参照してください。)ただし、カスタム・フィルタを使用すると、リスナーおよびフィルタのパッケージ化とデプロイメントが複雑になるため、できる限りJDKのフィルタ・クラスを使用することをお薦めします。「WebLogic Serverにリスナーのパッケージ化およびデプロイ化」を参照してください。

通知リスナーとフィルタの登録

通知リスナー・クラスを実装したら、MBeanインスタンスにリスナーを登録する(また、必要に応じてフィルタを構成して登録する)追加のクラスを作成します。

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

1. ランタイムMBeanサーバーまたはドメイン・ランタイムMBeanサーバーへの接続を初期化します。
「MBeanサーバーへのリモート接続の作成」を参照してください。

2. WebLogic Server MBeanに登録するには、MBean階層を移動して、リスニングするMBeanのオブジェクト名を取得します。「MBeanサーバーへのリモート接続の作成」を参照してください。
カスタムMBeanに登録するには、そのMBeanのJMXオブジェクト名を含むObjectNameを作成します。Java SE 7 API仕様のjavax.management.ObjectName (http://docs.oracle.com/javase/7/docs/api/javax/management/ObjectName.html)を参照してください。

3. 作成したリスナー・クラスをインスタンス化します。

4. (オプション) JDKのフィルタ・クラスのいずれかをインスタンス化して構成します。または、カスタム・クラスをインスタンス化します。

5. MBeanのオブジェクト名、リスナー・クラス、およびフィルタ・クラスをMBeanServerConnection.addNotificationListener (ObjectName name, ObjectName listener, NotificationFilter filter,Object handback)メソッドに渡して、リスナーとフィルタを登録します。

サンプル・クラスでは、例7-1のリスナーとJDKのAttributeChangeNotificationFilterを、ドメインのServerLifeCycleRuntimeMBeanに登録します。このクラスではhandbackオブジェクトは渡しません。

このサンプルで、weblogicはMBean属性を表示および変更する許可を与えられたユーザーです。MBeanの表示や変更を行う許可については、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。

サンプル・クラスには、RegisterListenerクラスをアクティブに保ち、メイン・プログラムを終了しないコードも含まれています。リスナー・クラスは、クラスの呼出しとアクティブの維持を行う、より大きなアプリケーションのコンテキストで動作するため、このコードは通常は必要ありません。ここでは、簡単にコンパイルしてサンプルの機能を確認できるように含まれています。

例7-2 ServerLifeCycleRuntimeMBeanへのリスナーの登録

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

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

import javax.management.AttributeChangeNotificationFilter;

public class RegisterListener {
private static MBeanServerConnection connection;
private static JMXConnector connector;
private static final ObjectName service;
// Initializing the object name for DomainRuntimeServiceMBean
// so it can be used throughout the class.
static {
try {
service = new ObjectName(
"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanserv
ers.domainruntime.DomainRuntimeServiceMBean");
}catch (MalformedObjectNameException e) {
throw new AssertionError(e.getMessage());
}
}

/*
* Initialize connection to the Domain Runtime MBean Server
* each server in the domain hosts its own instance.
*/
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();
}

/*
* Get an array of ServerLifeCycleRuntimeMBeans
*/
public static ObjectName[] getServerLCRuntimes() throws Exception {
ObjectName domainRT = (ObjectName) connection.getAttribute(service,
"DomainRuntime");
return (ObjectName[]) connection.getAttribute(domainRT,
"ServerLifecycleRuntimes");
}

public static void main(String[] args) throws Exception {
String hostname = args[0];
String portString = args[1];
String username = args[2];
String password = args[3];
try {
//Instantiating your listener class.
MyListener listener = new MyListener();
AttributeChangeNotificationFilter filter =
new AttributeChangeNotificationFilter();
filter.enableAttribute("State");

initConnection(hostname, portString, username, password);
//Passing the name of the MBeans and your listener class to the
//addNotificationListener method of MBeanServer.
ObjectName[] serverLCRT = getServerLCRuntimes();
int length= (int) serverLCRT.length;
for (int i=0; i < length; i++) {
connection.addNotificationListener(serverLCRT[i], listener,
filter, null);
System.out.println("\n[myListener]: Listener registered with"
+serverLCRT[i]);
}

//Keeping the remote client active.
System.out.println("pausing...........");
System.in.read();
} catch(Exception e) {
System.out.println("Exception: " + e);
}
}
}

WebLogic Serverにリスナーのパッケージ化およびデプロイ化

JMXリスナーは、リモート・アプリケーションとして、WebLogic Server起動クラスとして(サーバーが起動するとすぐにリスナーが使用可能になります)、またはWebLogic Serverにデプロイする他のアプリケーションの内部に、パッケージ化してデプロイできます。

JDKのフィルタを使用する場合は、フィルタ・クラスをパッケージ化する必要はありません。常にJDKから使用できるようになっています。

表7-3では、リスナーとカスタム・フィルタをパッケージ化してデプロイする方法について説明します。

表7-3 リスナーとカスタム・フィルタのパッケージ化とデプロイ

リスナーのデプロイ方法

リスナーに関する手順

カスタム・フィルタに関する手順

リモート・アプリケーションとして

リスナーのクラスをリモート・クライアントのクラスパスで使用可能にします。

フィルタのクラスをリモート・クライアントのクラスパスで使用可能にします。

また、モニターするMBeanをホストしている各サーバー・インスタンスのクラスパスにフィルタ・クラスを追加します。それには、クラスをJARファイルにアーカイブして、そのJARを各サーバーのlibディレクトリにコピーします。『Oracle WebLogic Serverドメイン構成の理解』のドメイン・ディレクトリの内容に関する項を参照してください。

WebLogic Server起動クラスとして

リスナー・クラスをサーバーのクラスパスに追加します。それには、クラスをJARファイルにアーカイブして、そのJARをサーバーのlibディレクトリにコピーします。

フィルタ・クラスをサーバーのクラスパスに追加します。それには、クラスをJARファイルにアーカイブして、そのJARをサーバーのlibディレクトリにコピーします。『Oracle WebLogic Serverドメイン構成の理解』のドメイン・ディレクトリの内容に関する項を参照してください。

WebLogic Serverにデプロイするアプリケーションの一部として

リスナー・クラスをアプリケーションと一緒にパッケージ化します。

リスナー・クラスをアプリケーションと一緒にパッケージ化します。

また、モニターするMBeanをホストしている各サーバー・インスタンスのクラスパスにフィルタ・クラスを追加します。それには、次のいずれかを行います。

- クラスをJARファイルにアーカイブして、そのJARを各サーバーのlibディレクトリにコピーします。『Oracle WebLogic Serverドメイン構成の理解』のドメイン・ディレクトリの内容に関する項を参照してください。

- JMX MLetサービスを使用して、フィルタ・クラスをMBeanサーバーで使用できるようにします。Java SE 7 API仕様のjavax.management.loading.MLet (http://docs.oracle.com/javase/7/docs/api/javax/management/loading/MLet.html)およびhttp://docs.oracle.com/javase/7/docs/technotes/guides/jmx/からダウンロードできるJMX 1.4仕様を参照してください。

例:構成MBeanの登録のリスニング

サーバーやJDBCデータ・ソースなどのWebLogic Serverリソースを作成すると、WebLogic Serverは構成MBeanを作成してドメイン・ランタイムMBeanサーバーに登録します。

これらのイベントをリスニングするには、リスナーをjavax.management.MBeanServerDelegateに登録します。

MBeanが登録または登録解除されるたびに、javax.management.MBeanServerNotification型の通知を送信します。Java SE 7 API仕様のMBeanServerDelegate (http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanServerDelegateMBean.html)を参照してください。

例7-3のサンプル・リスナーに関する以下の点に注意してください。

- 登録されたWebLogic Server MBeanのタイプに関する情報を提供するために、リスナーは登録されたMBeanのオブジェクト名を検索します。すべてのWebLogic Server MBeanオブジェクト名には、名前が「Type」で、値がMBeanのタイプを表す、キー・プロパティが含まれています。たとえば、ServerRuntimeMBeanのインスタンスには、オブジェクト名にType=ServerRuntimeキー・プロパティが含まれています。

- すべてのJMX通知にはType属性が含まれており、その値によって通知の分類とフィルタ処理ができます。MBeanServerNotificationのType属性には、2つの文字列「JMX.mbean.registered」または「JMX.mbean.unregistered」のうち1つだけ含まれています。また、JMX通知にはType属性の値を返すgetTypeメソッドも含まれます。
例7-3のリスナーは、Type属性の値に応じて異なるコード行を呼び出します。

- JDBCDataSourceRuntimeMBeanが登録されると、リスナーはこのMBeanのオブジェクト名をカスタム・メソッドに渡します。カスタム・メソッドはリスナーを登録し、JDBCDataSourceRuntimeMBean用のフィルタを構成します。このMBeanリスナーは、MBeanのEnabled属性が変更されるとメッセージを送信します。
カスタム・メソッドの実装クラスは(フィルタ・クラスではなく) 登録クラス内にあるので、メソッドは登録クラスのMBeanサーバーへの接続を再利用できます。再利用によってリソースが有効に活用され、複数のクラスに資格証明とURLを格納する必要がなくなります。

例7-3 例: MBeanの登録および登録解除のリスニング

import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.MBeanServerNotification;
import javax.management.ObjectName;

public class DelegateListener implements NotificationListener {
public void handleNotification(Notification notification, Object obj) {
if (notification instanceof MBeanServerNotification) {
MBeanServerNotification msnotification =
(MBeanServerNotification) notification;

// Get the value of the MBeanServerNotification
// Type attribute, which contains either
// "JMX.mbean.registered" or "JMX.mbean.unregistered"
String nType = msnotification.getType();

// Get the object name of the MBean that was registered or
// unregistered
ObjectName mbn = msnotification.getMBeanName();

// Object names for WebLogic Server MBeans always contain
// a "Type" key property, which indicates the
// MBean's type (such as ServerRuntime or Log)
String key = mbn.getKeyProperty("Type");

if (nType.equals("JMX.mbean.registered")) {
System.out.println("A " + key + " has been created.");

System.out.println("Full MBean name: " + mbn);
System.out.println("Time: " + msnotification.getTimeStamp());
if (key.equals("JDBCDataSourceRuntime")) {
// Registers a listener with a ServerRuntimeMBean.
// By defining the "registerwithServerRuntime" method
// in the "ListenToDelegate" class, you can reuse the
// connection that "ListenToDelegate" established;
// in addition to being an efficient way to use resources,
// it eliminates the need to store credentials and URLs in
// multiple classes.
ListenToDelegate.registerwithJDBCDataSourceRuntime(mbn);
}
}
if (nType.equals("JMX.mbean.unregistered")) {
System.out.println("An MBean has been unregistered");
System.out.println("Server name: " +
mbn.getKeyProperty("Name"));
System.out.println("Time: " + msnotification.getTimeStamp());
System.out.println("Full MBean name: "
+ msnotification.getMBeanName());
}
}
}
}

例7-4では、登録クラスのメソッドを示します。以下の点に注意してください。

- MBeanServerDelegateのJMXオブジェクト名は常に"JMImplementation:type=MBeanServerDelegate"。

- mainメソッドでは、通知のType属性の値が「JMX.mbean.registered」または「JMX.mbean.unregistered」で始まる場合にのみ通知を転送するように、javax.management.NotificationFilterSupportのインスタンスを構成します。

- registerwithJDBCDataSourceRuntimeメソッドは、指定されたJDBCDataSourceRuntimeMBeanインスタンスに例7-1のリスナーを登録します。このメソッドではjavax.management.AttributeChangeNotificationFilterも構成します。これは、Enabledという属性の変更について説明するAttributeChangeNotificationのみを転送します。

これらのメソッドをコンパイルして実行するには、例7-2の補助的なカスタム・メソッドを使用し、生成されたクラスをリモートJMXクライアントとして実行します。

例7-4 例: MBeanServerDelegateへのリスナーの登録

public static void main(String[] args) throws Exception {
String hostname = args[0];
String portString = args[1];
String username = args[2];
String password = args[3];
ObjectName delegate = new ObjectName(
"JMImplementation:type=MBeanServerDelegate");

try {
//Instantiating your listener class.
StartStopListener slistener = new StartStopListener();
NotificationFilterSupport filter = new NotificationFilterSupport();
filter.enableType("JMX.mbean.registered");
filter.enableType("JMX.mbean.unregistered");

/* Invoke a custom method that establishes a connection to the
* Domain Runtime MBean Server and uses an instance of
* MBeanServerConnection to represents the connection. The custom
* method assigns the MBeanServerConnection to a class-wide, static
* variable named "connection".
*/
initConnection(hostname, portString, username, password);

//Passing the name of the MBeans and your listener class to the
//addNotificationListener method of MBeanServer.
connection.addNotificationListener(delegate, slistener, filter,
null);

System.out.println("\n[myListener]: Listener registered ...");
//Keeping the remote client active.
System.out.println("pausing...........");
System.in.read();
} catch (Exception e) {
System.out.println("Exception: " + e);
}
}

// Called by the listener if it receives notification of a
// JDBCDataSourceRuntimeMBean being registered.
public static void registerwithJDBCDataSourceRuntime(ObjectName mbname) {
try {
MyListener mylistener = new MyListener();
AttributeChangeNotificationFilter filter =
new AttributeChangeNotificationFilter();
filter.enableAttribute("Enabled");

connection.addNotificationListener(mbname, mylistener,
filter, null);
} catch (Exception e) {
System.out.println("Exception: " + e);
}
}

モニターMBeanを使用した変更の観察:主な手順

モニターMBeanを構成して使用するには、次の手順に従います。

1. モニターの要件に合うモニターMBeanタイプを選択します。「モニターMBeanのタイプと通知の型の選択」を参照してください。

2. モニターMBeanからの通知をリスニングできるリスナー・クラスを作成します。「モニターMBean用の通知リスナーの作成」を参照してください。

3. モニターMBeanの作成、登録、および構成、リスナー・クラスのモニターMBeanへの登録、モニターMBeanの起動を行うクラスを作成します。「モニターとリスナーの登録」を参照してください。

モニターMBeanのタイプと通知の型の選択

JMXでは、特定のタイプの変更を観察する特別なモニターMBeanを提供しています。

- StringMonitorMBean - 値がStringの属性を観察します。
このモニターを使用して、ServerLifeCycleRuntimeMBean Stateなどの属性を定期的に観察します。

StringMonitorMBeanを実装するJava SE 7 API仕様のjavax.management.monitor.StringMonitor (http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/StringMonitor.html)を参照してください。

- GaugeMonitorMBean - 値がNumberの属性を観察します。
このモニターを使用して、通常の処理の結果として値が変動する属性を観察します。属性の値が特定の範囲外まで変動した場合に通知を送信するように、ゲージ・モニターを構成します。たとえば、ゲージ・モニターを使用してThreadPoolRuntimeMBean StandbyThreadCount属性をモニターし、サーバーの未使用かつ使用可能なスレッドの数が許容範囲内にあることを確認できます。

GaugeMonitorMBeanを実装するJava SE 7 API仕様のjavax.management.monitor.GaugeMonitor (http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/GaugeMonitor.html)を参照してください。

- CounterMonitorMBean - 値がNumberの属性を観察します。
このモニターを使用して、通常の処理の結果として値が増加する属性を観察します。属性の値が上限しきい値を超えた場合に通知を送信するように、カウンタ・モニターを構成します。しきい値を増やして指定された時点でしきい値をリセットするように、カウンタ・モニターを構成することもできます。

たとえば、サーバーでのヒット総数を追跡して、100ヒット増えるたびに通知を受けるようにするには、ServerRuntimeMBean SocketsOpenedTotalCount属性を観察するカウンタ・モニターを使用します。

CounterMonitorMBeanを実装するJava SE 7 API仕様のjavax.management.monitor.CounterMonitor (http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/CounterMonitor.html)を参照してください。

すべてのモニターMBeanはjavax.management.monitor.MonitorNotification型の通知を送信します。モニターMBeanは通知を生成するときに、特定の値を通知のTypeプロパティに書き込んで、通知を生成したイベントについて記述します。表7-4では、様々なタイプのモニターMBeanがエンコードするTypeプロパティの値について説明します。フィルタまたはリスナーは通知のgetType()メソッドを使用して、Typeプロパティ内のStringを取得します。

表7-4 モニターMBeanとMonitorNotificationのTypeプロパティ

モニターMBeanのタイプ

MonitorNotificationのTypeプロパティ内にエンコードされる文字列

CounterMonitor

jmx.monitor.counter.threshold - カウンタの値がしきい値(比較レベル)に到達したか、またはそれを超えた場合。

GaugeMonitor

jmx.monitor.gauge.high - 観察対象の属性値が増加し、上限しきい値と等しくなるかそれを超えた場合。この属性値が下限しきい値と等しくなるかそれを下回った場合を除き、以後上限しきい値に達しても通知は行われません。

jmx.monitor.gauge.low - 観察対象の属性値が減少し、下限しきい値と等しくなるかそれを下回った場合。この属性値が上限しきい値と等しくなるかそれを超えた場合を除き、以後下限しきい値に達しても通知は行われません。

StringMonitor

jmx.monitor.string.matches - 観察対象の属性値が比較文字列値と一致した場合。この属性値が比較文字列値と異なる場合を除き、以後この文字列が比較文字列と一致しても通知は行われません。

jmx.monitor.string.differs - この属性値が比較文字列値と異なる場合。この属性値が比較文字列値と一致する場合を除き、以後この文字列が比較文字列と異なっても通知は行われません。

エラーとMonitorNotificationのTypeプロパティ

エラーが発生した場合、すべてのモニターは通知のTypeプロパティに以下のいずれかの値をエンコードします。

- jmx.monitor.error.mbean - 観察対象MBeanがMBeanサーバーに登録されていないことを示します。通知では、観察対象のオブジェクト名が示されます。

- jmx.monitor.error.attribute - 観察対象の属性が観察対象オブジェクトに存在しないことを示します。通知では、観察対象のオブジェクト名と属性名が示されます。

- jmx.monitor.error.type - 観察対象の属性値のオブジェクト・インスタンスがnullか、またはモニターに対応していない型であることを示します。通知では、観察対象のオブジェクト名と属性名が示されます。

- jmx.monitor.error.runtime - 観察対象の属性値の取得中に(上記以外の理由で)スローされた例外が含まれます。

また、カウンタ・モニターとゲージ・モニターは、以下のような場合にTypeプロパティにjmx.monitor.error.thresholdをエンコードできます。

- カウンタ・モニターの場合、しきい値、オフセット、または係数の型が観察対象のカウンタ属性と同じでない場合

- ゲージ・モニターの場合、下限しきい値または上限しきい値が観察対象のゲージ属性と同じでない場合

モニターMBean用の通知リスナーの作成

観察対象の属性が指定した条件に一致する場合、モニターMBeanは通知を送信します。MonitorNotification用のリスナーを作成するための特別な要件はありません。以下の点を除いて、手順は「通知リスナーの作成」で説明した手順と同じです。

- MonitorNotification型の通知をリスニングします。

- 必要に応じて、javax.management.monitor.MonitorNotificationクラスをインポートし、そのメソッドを呼び出して、通知を生成したイベントに関する追加情報を取得できます。

例7-5を参照してください。

例7-5 モニター通知用のリスナー

import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
public class MonitorListener implements NotificationListener {
public  void handleNotification(Notification notification, Object obj) {
if(notification instanceof Notification) {
Notification notif = (Notification) notification;
System.out.println("Notification type" + notif.getType() );
System.out.println("Message: " + notif.getMessage() );
}
if (notification instanceof MonitorNotification) {
MonitorNotification mn = (MonitorNotification) notification;
System.out.println("Observed Attribute: " +
mn.getObservedAttribute());
System.out.println("Trigger: " + mn.getTrigger() );
}
}
}

モニターとリスナーの登録

モニターMBeanを使用するには、まず、MBeanサーバー内でモニターMBeanのインスタンスを作成して登録する必要があります。次に、作成したモニターMBeanにリスナーを登録します。この手順のすべてを1つのクラスの中で行うことができます。

モニターMBeanを登録し、リスナーを登録して、モニターMBeanを起動するには、次の手順に従います。

1. ドメイン・ランタイムMBeanサーバーへの接続を初期化します。
「MBeanサーバーへのリモート接続の作成」を参照してください。

2. モニターMBeanインスタンスのObjectNameを作成します。
Java SE 7 API仕様のjavax.management.ObjectName (http://docs.oracle.com/javase/7/docs/api/javax/management/ObjectName.html)を参照してください。

オブジェクト名は組織の名前で始めて、モニターMBeanインスタンスの目的を明確に表すキー・プロパティを含めることをお薦めします。

例: mycompany:Name=SocketMonitor,Type=CounterMonitor

3. いずれかのモニターMBeanを作成して登録します。
javax.management.MBeanServerConnection.createMBean(String classname ObjectName name)メソッドを使用します。ここで、

- classnameは、次のいずれかの値です。

- javax.management.monitor.CounterMonitor

- javax.management.monitor.GaugeMonitor

- javax.management.monitor.StringMonitor

- nameは、モニターMBeanインスタンス用に作成したオブジェクト名です。

4. 属性値を設定して、モニターMBeanを構成します。
設定する属性のガイドラインについては、Java SE 7 API仕様のjavax.management.monitoringパッケージ(http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/package-summary.html)を参照してください。

5. モニターMBeanがモニターするMBean(観察対象MBean)を指定するには、モニターMBeanのaddObservedObject(ObjectName objectname)およびaddObservedAttribute(String attributename)操作を呼び出します。

- objectnameは観察対象MBeanのObjectName

- attributenameはモニターする観察対象MBeanの属性名

モニターMBeanの1つのインスタンスで複数のMBeanをモニターできます。モニターするMBeanインスタンスごとにaddObservedObjectおよびaddObservedAttribute操作を呼び出します。

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

7. 必要に応じて、フィルタをインスタンス化して構成します。

8. リスナーとフィルタ(オプション)をモニターMBeanに登録します。リスナーを観察対象MBeanには登録しないでください。
モニターMBeanのaddNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)メソッドを呼び出します。

9. モニターMBeanのstart()操作を呼び出して、モニターを起動します。

例: CounterMonitorMBeanとそのリスナーの登録

例7-6では、CounterMonitorMBeanを作成および構成して、ドメインの各ServerRuntimeMBeanインスタンスのSocketsOpenedTotalCount属性を観察するクラスのmain()メソッドを示します。(Oracle WebLogic Server MBeanリファレンスのSocketsOpenedTotalCountに関する項を参照。)

このサンプル・コードでは、ServerRuntimeMBeanの複数のインスタンスをモニターできるように、ドメイン・ランタイムMBeanサーバーに接続します。以下の点に注意してください。

- CounterMonitorMBeanの1つのインスタンスでServerRuntimeMBeanのすべてのインスタンスをモニターします。ドメイン・ランタイムMBeanサーバーは、別のJVMで動作するServerRuntimeMBeanインスタンスへの結合アクセスをCounterMonitorMBeanに与えています。

- リスナー・クラスのとフィルタ・クラスの1つのインスタンスが、CounterMonitorMBeanからの通知をリスニングしてフィルタ処理します。

このmainメソッドをコンパイルして実行するには、例7-2の補助的なカスタム・メソッドを使用し、生成されたクラスをリモートJMXクライアントとして実行します。

例7-6 例: CounterMonitorMBeanとそのリスナーの登録

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

try {
/* Invokes a custom method that establishes a connection to the
* Domain Runtime MBean Server and uses an instance of
* MBeanServerConnection to represents the connection. The custom
* method assigns the MBeanServerConnection to a class-wide, static
* variable named "connection".
*/
initConnection(hostname, portString, username, password);
//Creates and registers the monitor MBean.
ObjectName monitorON =
new ObjectName("mycompany:Name=mySocketMonitor,Type=CounterMonitor");
String classname = "javax.management.monitor.CounterMonitor";
System.out.println("===> create mbean "+monitorON);
connection.createMBean(classname, monitorON);

//Configure the monitor MBean.
Number initThreshold = new Long(2);
Number offset = new Long(1);
connection.setAttribute(monitorON,
new Attribute("InitThreshold", initThreshold));
connection.setAttribute(monitorON, new Attribute("Offset", offset));
connection.setAttribute(monitorON,
new Attribute("Notify", new Boolean(true)));

//Gets the object names of the MBeans that you want to monitor.
ObjectName[] serverRT = getServerRuntimes();
int length= (int) serverRT.length;
for (int i=0; i < length; i++) {
//Sets each instance of ServerRuntime MBean as a monitored MBean.
System.out.println("===> add observed mbean "+serverRT[i]);
connection.invoke(monitorON, "addObservedObject",
new Object[] { serverRT[i] },
new String[] { "javax.management.ObjectName" });

Attribute attr = new Attribute("ObservedAttribute",
"SocketsOpenedTotalCount");
connection.setAttribute(monitorON, attr);
}

// Instantiates your listener class and configures a filter to
// forward only counter monitor messages.
MonitorListener listener = new MonitorListener();
NotificationFilterSupport filter = new NotificationFilterSupport();
filter.enableType("jmx.monitor.counter");
filter.enableType("jmx.monitor.error");

//Uses the MBean server's addNotificationListener method to
//register the listener and filter with the monitor MBean.
System.out.println("===> ADD NOTIFICATION LISTENER TO "+monitorON);
connection.addNotificationListener(monitorON, listener, filter, null);
System.out.println("\n[myListener]: Listener registered ...");

//Starts the monitor.
connection.invoke(monitorON, "start", new Object[] { }, new String[] { });

//Keeps the remote client active.
System.out.println("pausing...........");
System.in.read();
} catch(Exception e) {
System.out.println("Exception: " + e);
e.printStackTrace();
}
}

8 WebLogic Server JMXサービスの構成

この章では、WebLogic Serverドメインの内部で使用可能なJMXサービスの特定セットを確立して構成する方法について説明します。たとえば、本番環境では、WebLogic Server編集サービスを無効にして、ドメインに対する実行時の変更をほとんどできないようにすることが可能です。

この章の内容は以下のとおりです。

- ドメインで使用可能なJMXサービスの決定

- 例: WebLogic Scripting Toolを使用してドメインを読取り専用にする方法

ドメインで使用可能なJMXサービスの決定

WebLogicドメインの内部で、どのJMXサービスを使用可能にするかを指定できます。

JMXMBeanの次の属性によって、ドメインで使用可能なJMXサービスが決まります(Oracle WebLogic Server MBeanリファレンスのJMXMBeanに関する項を参照)。

- EditMBeanServerEnabled - JMXクライアント(WebLogic Server管理コンソールやWebLogic Scripting Toolなどのユーティリティを含む)がドメインの構成を変更できるかどうかを制御します。

- DomainMBeanServerEnabled: JMXクライアントが、ドメイン・ランタイムMBeanサーバーへの1つの接続を介して、すべてのランタイムMBeanと読取り専用構成MBeanにアクセスできるかどうかを制御します。

- RuntimeMBeanServerEnabled: JMXクライアントが、サーバーのランタイムMBeanサーバーを介して、特定のサーバーのランタイムMBeanと読取り専用構成MBeanにアクセスできるかどうかを制御します。

- PlatformMBeanServerEnabledすべてのWebLogic Serverインスタンスが、JDKプラットフォームMBeanサーバーを初期化するかどうかを制御します。PlatformMBeanServerUsedすべてのWebLogic Serverインスタンスが、ランタイムMBeanサーバーをJDKプラットフォームMBeanサーバーとして起動するかどうかを制御します。これによって、1つのMBeanサーバーからWebLogic Server MBeanおよびJVMプラットフォームMBeanにアクセスできるようになります。

- CompatibilityMBeanServerEnabled - JMXクライアントが非推奨のweblogic.management.MBeanHomeインタフェースを使用してWebLogic Server MBeanにアクセスできるようにします。

- ManagementEJBEnabled - 現在のWebLogic ServerドメインがJava EE管理APIをサポートするかどうかを制御します。

例: WebLogic Scripting Toolを使用してドメインを読取り専用にする方法

以下の例では、WebLogic Scripting Tool (WLST)を使用して、JMXMBean EditMBeanServerEnabled属性をfalseに設定します。Windowsコンピュータ上でWLSTを実行し、c:\mydomainにドメインを作成していて、WebLogic Serverがドメインと一緒に作成したスクリプトを削除していないことを前提としています。

注意:
以下の手順によって、JMXクライアント(WebLogic Server管理コンソールおよびオンライン・モードのWebLogic Scripting Toolを含む)はドメインの構成を変更できなくなります。ただし、WebLogic Scripting Toolのオフライン編集機能を使用してドメイン構成を変更することはできます。
WebLogic Serverデプロイメント・サービスはJMXを使用しないので、これらの手順によって、JMXクライアントがモジュールをデプロイまたはアンデプロイできなくなることはありません。

1. ドメインの管理サーバーを起動します。

2. コマンド・プロンプトで、次のスクリプトを実行して必要な環境を設定します。

c:\mydomain\setDomainEnv.cmd

3. 同じコマンド・プロンプトで、以下のコマンドを入力します。

1. java weblogic.WLST

2. connect('weblogic','weblogic')

3. edit()

4. startEdit()

5. cd('JMX/mydomain')

6. set('EditMBeanServerEnabled','false')

7. activate()

8. exit()

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2016, Oracle and/or its affiliates.All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティについて

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。