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の監視に用いるための仕様です。

すでにTomcatJBossなど様々なシステムで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の構成
図1 JMXの構成

著者紹介 櫻庭祐一

横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名