Javaにおけるソフトウエア管理フレームワークがJava Management Extensions(JMX)です。JMXはJava EEでは1.3から,Java SEでも5.0から標準で使用できるようになっています。
Javaの様々な仕様はJava Community Process(JCP)で策定されていますが,このJMXもJCPで仕様策定が行なわれています。JCPで策定されている仕様はJava Specification Requests(JSR)番号で管理されています。
JMXに関するJSRには以下のようなものがあります。
- JSR-003 Java Management Extensions(JMX) Specification
- JSR-160 Java Management Extensions(JMX) Remote API 1.0
- JSR-174 Monitoring and Management Specification for the Java Virtual Machine
- JSR-255 Java Management Extensions(JMX) Specification, version 2.0
基本になるのがJSR-003で,JSR-255はJSR-003のバージョンアップのための仕様です。JSR-255はJava SE 7(開発コード名Dolphin)で採用予定であり,まだ最終的な仕様は確定していません。JSR-174はJVMの監視に用いるための仕様です。
すでにTomcatやJBossなど様々なシステムでJMXが導入されています。もちろん,J2EE 1.4に準拠したアプリケーション・サーバーではJMXは必須です。サーバー側だけでなく,MC4JのようにJMXを使用した管理ツールもあります。
J2SE 5.0からは,簡易ソフトウエア管理ツールであるjconsoleも標準で提供されているので,これを使用することもできます。
さて,このようにいろいろなところで使われているJMXですが,実際にはどのように管理を行なうのでしょう。
肝となるのがManaged Bean,通称MBeanと呼ばれるものです。
再び,健康管理にたとえてみましょう。
体重を知るためにはどうしますか。当然ですが,体重計に乗りますよね。血圧を測りたければ,血圧計を使います。
MBeanはここでいう体重計や血圧計に相当すると考えることができます。管理を行ないたいオブジェクトやコンポーネントに対応させたMBeanを配置し,MBeanを介してオブジェクトやコンポーネントの情報を取得します。
ただし,MBeanは管理対象のオブジェクトやコンポーネントから情報を取得するだけではありません。MBeanは注射や薬にも対応しています。つまり,MBeanが管理対象オブジェクト/コンポーネントに対してメソッド・コールを行なうことも可能なのです。
また,もう一つの役割を持っています。それはイベントの発信です。JMXではこれをノティフィケーションと呼びますが,イベントの一種と考えることができます。つまり,なにか悪い兆候が示されたら,それをアプリケーションの外部に伝えるすべを持っているわけです。
これらをまとめると,MBeanは次のような情報や機能を併せ持つものと定義できます。
- プロパティ
- オペレーション
- ノティフィケーション
実際にはMBeanはインタフェースとして定義されるので,プロパティはゲッター・メソッドとセッター・メソッド,オペレーションは通常のメソッド,ノティフィケーションはリスナ登録(addNotificationListener)として定義されます。
もちろん,これらは必要に応じて取捨選択できます。情報を取得するだけであれば,読み取り専用のプロパティだけを持つ(つまりゲッター・メソッドだけを持つ)MBeanを定義できます。
MBean管理対象に応じてそれぞれ定義する必要があります。体重でも血圧でも測るものが異なれば,使う器具も変化するのですから,MBeanもそれ専用に定義しなくてはならないのもごくごく自然ですよね。
MBeanは,この定義のしかたによって大別すると二つ,さらに細かく見ると5種類に分けることができます。表1にそれを示しました。
よく使われるのがOpen MBeanとModel MBean,そしてJ2SE 5.0ではMXBeanもよく使用されます。Model MBeanはXMLファイルから動的にMBeanを生成できるJakarta Commons Modelerと併せて使われることが多いようです。
表1 MBeanの種類
Standard MBean | 最も基本的なMBean MBeanの定義は静的に行い,アプリケーション動作時には変更不可 |
|
---|---|---|
Dynamic MBean | 動的に定義の変更が可能なMBean Dynamic MBeanは必ずjavax.management.DynamicMBeanインタフェースもしくはその派生インタフェースを実装する |
|
Open MBean | 使用する型をStringやIntegerなどの基本的なデータ型に限定したDynamic MBean 使用できる型はjavax.management.openmbean.OpenTypeクラスに定義されている |
|
Model MBean | javax.management.modelmbean.ModelMBeanインタフェースで定義されるMBean 通常はRequiredModelMBeanクラスを使用し,既存のクラスを容易に管理することが可能 |
|
MXBean | JSR-174で定義されているJVMへのアクセスを行なうためのMBean 基本的にはOpen MBeanとして扱うことができるが,独自の拡張も施されている |
キーとなるのはMBeanですが,これらがアプリケーション中にバラバラに配置されていてもしかたありません。MBeanをまとめて,外部とのアクセスの窓口となるのがMBeanServerです。MBeanServerはいわばMBeanのコンテナであり,MBeanへのファサードとして機能します。
同一プロセス中で管理も一緒に行なう(自己診断する)のであればMBeanServerが窓口になりますが,リモートから管理を行なう場合にはそうはいきません。
このような場合に使用するのが,外部との通信を行うコネクタもしくはプロトコル・アダプタです。コネクタがJSR-160で規定されたプロトコルを使用するに対し,プロトコル・アダプタは他のプロトコルに変換して使用するものです。HTMLプロトコル・アダプタや,ネットワーク機器の管理に使用されるSNMP(Simple Network Management Protocol)プロトコル・アダプタなどがあります。
これらをまとめたものを図1に示します。
JSR-003の中では,MBeanの階層をInstrumentation Level,MBeanServerのレベルをAgent Level,コネクタやプロトコル・アダプタからリモートの管理ツールを含めた階層をDistributed Service Levelと定義しています。
このようなフレームワークを用いてソフトウエアの管理を行なっていくのです。
![]() |
図1 JMXの構成 |
---|
著者紹介 櫻庭祐一 横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名 |