レベル: 中級 J. Jeffrey Hanson (jeff@jeffhanson.com), Chief Architect, eReinsure.com, Inc.
2006年 8月 01日 Java™ コミュニティーでは、システム、アプリケーション、そしてリソース管理の標準として、JMX (Java Management Extension) 仕様およびフレームワークを受け入れています。Apache Geronimo プラットフォームの設計において第一に優先されたのは管理の容易さで、JXM はこの容易性に貢献している主要な技術のうちの 1 つとなっています。この記事を読んで、JMX を使って Geronimo プラットフォームを管理する方法を理解してください。
Apache Geronimo は、JMX フレームワーク対応の汎用 IoC (Inversion of Control) カーネル上に構築され、GBean (Geronimo Bean) と呼ばれる管理対象コンポーネントの集合を監視します。Geronimo は JMX を基礎カーネル・インフラストラクチャーとして作成されているため、MBean (JMX Managed Bean) との類似点がいくつかあります。オブジェクトの配置、オブジェクト間の通信、メソッドのインターセプトなどに JMX を使うことは、所詮無理なことと考えられていたため、Geronimo の構造は時とともに多少変化しています。ただし、JMX のレガシーは、GBean フレームワークをはじめとする Geronimo アーキテクチャーにまだ残されています。
一方、JMX は Java プラットフォーム、J2EE (Java 2 Platform、Enterprise Edition)、そして Java Enterprise Edition (Java EE) 内のリソースの管理における事実上の標準となっています。JMX は、管理目的で使用できる属性と操作によって Java クラス、インターフェース、およびランタイム・オブジェクトの動的インスツルメンテーションのための標準を定義しています。JMX では、アプリケーション、デバイス、サービスなど、Java プログラミング言語で抽象化できるものであれば、どんなリソースでもインスツルメンテーションと管理が可能です。それぞれの管理対象リソースは、MBean と呼ばれます。JMX では以下の 4 つのタイプの MBean を定義しています。
-
Standard MBean (標準 MBean): Java インターフェースを使用して管理属性と操作を定義します。
-
Dynamic MBean (動的 MBean): ランタイム・ディスカバリーによって管理属性と操作を定義します。
-
Model MBean (モデル MBean): オブジェクトのプロキシーとして動作し、管理可能な操作と属性を公開します。
-
Open MBean (オープン MBean): 事前定義されたメタデータ・ボキャブラリーを使用して、クラスおよびオブジェクトの管理可能な属性と操作を公開します。
MBean を操作するための主要インターフェースは、javax.management.MBeanServer
です。
MBeanServer
は MBean の中央リポジトリーとして機能し、クライアントから容易に MBean と通信できるようにします。MBean は以下のものから構成されるObjectName インスタンスによって、それぞれ固有に識別されます。
-
ドメイン: 特定のドメインの任意の名前。規則では、ドメインには Java パッケージのネーミングと同じように、リバース DNS (ドメイン・ネーム・システム) のネーミングを使うことを推奨しています。
-
キー・プロパティー・リスト: キー、および関連する値の任意の順不同のセット。
標準的なObjectName
は、次のように構成します。
String domain = "com.jeffhanson.test";
String keyPropertyList = "Name=TestBean,Type=GenericService";
ObjectName objName = new ObjectName (domain + ":"+ keyPropertyList);
|
ObjectName
インスタンスは、属性を検索して MBean で操作を呼び出す
MBeanServer
メソッドの多くでパラメーターとして使用できます。例えば、ある MBean で操作を呼び出すには、invoke メソッドを呼び出す MBean サーバーへの参照を取得します。MBean サーバーへの参照を取得すると、invoke メソッドのターゲット・オブジェクトを表す ObjectName が、2 番目のパラメーターとしての操作名、続いて MBean サーバーが正しい MBean を検出して呼び出すために必要な残りの情報とともに
invoke
メソッドに渡されます。Geronimo では今でも、GBean が関連するメソッド呼び出しのほとんどで、GBean を参照するために ObjectName インスタンスを使用しています。
JMX、そして Geronimo の GBean フレームワークとの関係
事実上、Geronimo のすべての有効オブジェクトは GBean です。Geronimo のカーネル、そして Geronimo プラットフォーム内でインスタンス化されるその他すべての有効オブジェクトは、GBean としてインスツルメンテーションが行われ、JMX MBean として公開されるので、JMX 対応ツールによる管理が可能です。このようにして、Geronimo の実行中インスタンスの管理および監視は、標準ポータル、ダッシュボード、コンソールを使用して行うことができます。
Geronimo の GBean は
GBeanInfo
クラスによって属性、操作、通知を公開し、この情報をJMX の MBeanInfo クラスに伝播します。図 1 に、Geronimo と JMX の関係の概要を示します。
図 1. Geronimo と JMX の関係
表 1 に、Geronimo の GBean と JMX の MBean との類似点を示します。
表 1. MBeans と GBeans との類似点
| 目的 | MBean で使用する構造 | GBean で使用する構造 |
|---|
| 管理対象リソースの操作、属性、通知、およびコンストラクターのデータ構造を保持する | An
MBeanInfo
構造 |
GBeanInfo 構造
| | 管理対象リソースのコンストラクターに関する情報をカプセル化する |
ConstructorInfo 構造 |
GConstructorInfo 構造 | | 管理対象リソースの操作に関する情報をカプセル化する |
MBeanOperationInfo 構造 |
GOperationInfo 構造 | | 管理対象リソースの属性に関する情報をカプセル化する |
MBeanAttributeInfo 構造 |
GAttributeInfo 構造 | | 管理対象リソースの通知およびイベントに関する情報をカプセル化する |
MBeanNotificationInfo 構造 |
GNotificationInfo 構造 |
JMX には、MBean 情報をリモートから検索して表示するための API (アプリケーション・プログラム・インターフェース) もあります。Geronimo はこの API をサポートし、この API を使って一連の GBean を MBean としてリモート・クライアントに公開できます。
Geronimo と JMX リモーティング
Geronimo は JMX リモート API (JSR 160) をサポートするため、これを使って MBean サーバーをリモートから管理および監視することができます。JSR 160 では、JMX 対応のアプリケーションとサービスはコネクターを提供し、そのコネクターがサポートするプロトコル (HTTP、RMI (リモート・メソッド呼び出し) など) で、JMX クライアントが接続できるということを、明記しています。JSR 160 は、すべての JMX リモーティング・インプリメンテーションに関する必須 RMI ベース・コネクターを定義しています。
org.apache.geronimo.jmxremoting パッケージに含まれる jmx-remoting モジュールは、JSR 160 JMX Remoting (「参考文献」にリンクを記載) による Geronimo サーバーへのリモート・アクセスを提供します。Geronimo の RMI コネクターを使用可能にするには、以下の 2 つの Geronimo サービスを起動して実行状態にする必要があります。
-
org.apache.geronimo.system.RMIRegistryService: 指定されたポートで RMI レジストリーを開始します。
-
org.apache.geronimo.jmxremoting.JMXConnector: RMI コネクター・サーバーを作成し、コネクター・サーバー URL に指定された RMI レジストリーにエクスポートします。
上記の 2 つのサービスが実行中になると、リスト 1 のコードを Geronimo の MBean サーバーに接続して、Geronimono の MBean での操作を実行できるようになります。
リスト 1. Geronimo へのリモート接続
Map environment = new HashMap();
String[] credentials = new String[]{"system", "manager"};
environment.put(JMXConnector.CREDENTIALS, credentials);
JMXServiceURL address =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost/JMXConnector");
JMXConnector jmxConnector =
JMXConnectorFactory.connect(address, environment);
MBeanServerConnection mbServerConn =
jmxConnector.getMBeanServerConnection();
System.out.println("DefaultDomain: "
+ mbServerConn.getDefaultDomain());
|
上記の例に示した RMI コネクターは、リモート MBean サーバーを指す JMXServiceURL によって異なります。JMXServiceURL は、プロトコル (この例では rmi)、ホスト (この例では localhost)、ポート (この例では暗黙)、そして URL パス (この例では JMXConnector) を中心に構築されたアドレスを使用して、コネクターのスタブの場所を示します。実行中の Geronimo インスタンスへの接続が有効になると、リスト 2 のコードを使って Geronimo カーネルに関連付けられたすべての MBean に関する情報を表示できます。
リスト 2. Geronimo のカーネルに関する MBean 情報の表示
ObjectName kernelObjName =
JMXUtil.getObjectName(":role=Kernel");
MBeanInfo mBeanInfo = mbServerConn.getMBeanInfo(kernelObjName);
if (mBeanInfo != null)
{
System.out.println("\nDumping Kernel MBeanInfo...");
dumpMBeanInfo(mBeanInfo);
}
|
それぞれの MBean は、MBeanInfo クラスのインスタンスという形で MBean 自体に関する一連の情報を公開します。この情報が、属性、操作、そして通知内にカプセル化されます。リスト 3 に、この情報を表示する方法を示します。
リスト 3. Geronimo のカーネル内に含まれる MBean のデータを伝達する MBeanInfo インスタンス
private static void dumpMBeanInfo(MBeanInfo info)
{
MBeanAttributeInfo[] aInfos = info.getAttributes();
System.out.println(" Attribute Infos:");
if (aInfos != null)
{
for (int i = 0; i < aInfos.length; i++)
{
System.out.println(" "
+ aInfos[i].getType()
+ " " + aInfos[i].getName());
}
}
MBeanOperationInfo[] oInfos = info.getOperations();
System.out.println(" Operation Infos:");
if (oInfos != null)
{
for (int i = 0; i < oInfos.length; i++)
{
String signature = getSignature(oInfos[i]);
System.out.println(" "
+ oInfos[i].getReturnType()
+ " " + oInfos[i].getName()
+ signature);
}
}
}
private static String getSignature(MBeanOperationInfo oInfo)
{
String signature = "(";
MBeanParameterInfo[] paramInfos = oInfo.getSignature();
if (paramInfos != null)
{
for (int j = 0; j < paramInfos.length; j++)
{
if (j > 0)
{
signature += ", ";
}
signature += paramInfos[j].getType();
}
}
signature += ")";
return signature;
}
|
JMX を備えた Geronimo は、包括的かつ強力なデバッグ環境を有効にするのに十分な情報を提供します。Geronimo は、すべての Geronimo の実行中インスタンスに使うことができるブラウザー・ベースのデバッグ・コンソールによって、この環境を最大限利用します。
Geronimo の JMX Debug Console
Geronimo の JMX Debug Console は、JMX を使って実行中の Geronimo サーバーの状態を監視し、デプロイされたアプリケーションをデバッグするためのデバッグ・ツールです。Geronimo 起動コマンドラインで、
org/apache/geronimo/DebugConsole
を構成ファイルのリストに追加してください。これによって、Geronimo は JMX Debug Console を、実行中の Geronimo インスタンスの /debug-tool コンテキスト (つまり、http://servername:8080/debug-tool/。ここで、servername はデバッグ・ツールが常駐するコンピュータの名前) にデプロイします。このデバッグ・ツールは MBean のリストを表示します。リスト内の MBean をクリックすると、ページ右側のテーブルに追加情報が表示されます。図 2 に、Geronimo/jmxdebug-jetty/1.0/car MBean の場合の追加情報の例を示します。
図 2. Geronimo JMX Debug Console 内の MBean の場合の追加情報
Geronimo と JMX のコンソール
Geronimo は JMX と密接に統合されるため、Geronimo のランタイム情報を表示して管理するには、JMX 対応のコンソール・アプリケーションまたはユーティリティーを使うことができます。この標準化された相互作用は、JMX で最も便利な利点のうちの 1 つです。以下のセクションでは、MC4J JMX コンソールを使って Geronimo を管理および監視する方法を説明します。
MC4J JMX コンソールを使って Geronimo の構成およびランタイム情報を管理する
MC4J は、JMX ベースの管理ソフトウェアを作成するための Java オープン・ソース・プロジェクトです。これは JMX 仕様が提供する標準リモーティング機能およびインスツルメンテーション機能を使って JMX 対応アプリケーション、サーバー、そしてサービスに接続し、管理および監視を行います。
MC4J Web サイト (「参考文献」にリンクを記載) から、ご使用の環境に適切な MC4J をダウンロードして実行してください。MC4J コンソールのインストールが完了すると、これを実行して Geronimo や JMX 対応アプリケーションの実行中インスタンスを管理および監視できるようになります。図 3 に示すように、MC4J には JXM 対応アプリケーションのプロパティー、グラフ、そしてその他の情報を表示する 4 つの主要なペインがあります。
図 3. MC4J のペイン
MC4J は、Geronimo の RMI サーバーを介して Geronimo の実行中インスタンスに接続できます。
- 管理メニューから Create Server Connection (サーバー接続の作成) を選択し、Server connection type (サーバー接続タイプ) リストから Geronimo を選択します。
- Principle の値には
system、Credentials の値には manager を入力します。
- この接続に名前を付け、Next (次へ) をクリックします。
-
Finish (完了) をクリックします。MC4J が、Geronimo で公開された MBean をロードします。
Managed Objects Explorer (管理対象オブジェクト・エクスプローラー) ペインに表示された Geronimo 接続ノードを展開して、Geronimo の MBean の属性、操作、および通知をブラウズします。図 4 に、MC4J の Managed Objects Explorer ペインの表示例を示します。
図 4. MC4J の Managed Objects Explorer ペイン
いずれかの MBean を右クリックして、Available dashboards (使用可能なダッシュボード) を選択します。表示されるメニューから、Basic MBean View (基本 MBean ビュー) を選択します。図 5 に、Basic MBean View ダッシュボードで表示した場合の Geronimo/jmxdebug-jetty/1.0/car を示します。
図 5. Basic MBean View ダッシュボード
MC4J コンソールの Basic MBean View では、Geronimo の MBean でリアルタイムの操作を実行できます。ここで時間を割いて、MC4J で構成して監視できる数多くの値を調べてみてください。
MBeanServerKernelBridge および MBeanGBeanBridge を使って Geronimo と JMX をリンクする
Geronimo には、Geronimo の GBean フレームワークと JMX の MBean フレームワークとのギャップを埋めるいくつかのクラスが用意されています。MBeanServerKernelBridge クラスは、Geronimo にロードされた各 GBean を対応する MBeanServer インスタンスに MBean として登録します。この動作により、Geronimo での MBean の公開プロセスが、単に MBean を GBean 内でカプセル化して、その GBean を Geronimo カーネルに登録するだけのことになります。
カーネルの起動時に MBeanServerKernelBridge インスタンスが開始されると、このインスタンスはカーネルに登録されたすべての GBean のリストを取得し、これらの GBean を MBean に変換します。MBeanGBeanBridge インスタンスの形をとるこれらの MBean は動的 MBean で、Geronimo カーネルへの参照、そして各 GBean の GBeanInfo 参照に格納された情報を維持します。
MBeanServer KernelBridge インスタンスは GBean として Geronimo カーネルに登録されるため、このインスタンスは自動的に LifecycleAdapter インプリメンテーションとして登録され、新しい GBean がカーネルに登録されると常にロード/アンロードされたイベントを受け取ります。ロード/アンロードのイベントが発生すると、MBeanServerKernelBridge は関連付けられた各 GBean をMBean として MBeanServer に 登録/登録解除します。これにより、JXM 対応クライアントには Geronimo の現在の状態と Geroninimo カーネルが正確に表示されます。
まとめ
Geronimo の作成者は、管理しやすさを第一の目標としてプラットフォームを設計しました。この目標を実現させるために Geronimo が使用した必須技術のうちの 1 つが、JMX です。Geronimo は JMX と密接に関係しているため、Geronimo の構成とランタイム・プロパティーを管理するための詳細なインスツルメンテーション機能が可能になっています。
Geronimo の汎用カーネルは、GBean と呼ばれる管理対象コンポーネントのリポジトリーを管理するJMX フレームをサポートしています。また Geronimo には、Geronimo の GBean フレームワークと JMX の MBean フレームワークとのギャップを埋めるヘルパー・クラスが用意されています。これにより、Geronimo での MBean の公開プロセスは、ヘルパー・クラスに MBean を登録し、この MBean を GBean として Geronimo カーネルに登録するだけのシンプルなものになります。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Geronimo and JMX snippets | GeronimoJMX.zip | 38KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Jeff Hansonはソフトウェア業界で20年以上の経験を持っており、シニア・エンジニアとしてOpenDocのMicrosoft® Windows®への移植プロジェクトや、中心アーキテクトとしてNovellのRoute 66フレームワークなどに従事してきました。現在はeReinsure.com, Inc.の中心アーキテクトであり、Java EEベースの再保険システム用のWebサービス・フレームワークやプラットフォームの構築を行っています。彼は数多くの記事や本を執筆しており、その一部には『.NET versus J2EE Web Services』や『A Comparison of Approaches, Pro JMX』、『Java Management Extensions, and Web Services Business Strategies and Architectures』などがあります。
|
記事の評価
|