初めての JMX (MBean/エージェント[MBean サーバー/プロトコル・アダプター])

JBOSS では全面的に採用されていますが、Java Management Extentions (JMX) という、いろいろなリソースを管理するための標準があります。
ハードウェアでもソフトウェアでも、この JMX に則って管理インターフェイスを書いておけば、簡単に管理エージェントやアクセスするためのプロトコル・アダプターを組み合わせることができる、というものです。

具体的にどのように使用できるかは JBOSS の管理コンソールの例を見ていただければよりわかると思いますが、たとえば、この JMX インターフェイスをとおしてサーバーのシャットダウンも可能になっています。その際、プロトコル・アダプターとしては HTTP と RMI が組み合わされていますので、どちらの手段を使用してもシャットダウンを行うことができるようになっています。

JMX については Sun から出ている White Paper があります。

作るのも難しいものではありません。
簡単に紹介していきたいと思います。


MBean

管理されるリソースを代表する JavaBeans を作成します。これが MBean (Managed Bean) と呼ばれるものになります。この後、実例を見ていきますが、アクセスできる属性と実行可能な操作を管理対象に対して定義したものになります。

エージェント (MBean サーバー/プロトコル・アダプター)

MBean を管理するものはエージェントと呼ばれ、MBean サーバーとプロトコル・アダプターないしコネクターから構成されます。

MBean サーバーとは MBean を 1つないしいくつかまとめて、その登録簿として機能するものになります。この MBean サーバーはエージェントに登録され、これを通じて MBean は使用できるようになります。

そして MBean を操作するためのアクセス・プロトコルをハンドルするためのクラスをプロトコル・アダプターといいます。例えば HTML アダプターとか RMI アダプターといったようになっています。
エージェントに登録して使用し、このプロトコル・アダプターを通じて MBean サーバーにアクセスできるようになります。


準備

準備としては JMX Reference Implementation のバイナリをダウンロードして、どこかのディレクトリに解凍しておくだけで OK です。
デフォルトでは jmx_1.1_ri_bin というディレクトリになります。実際に使用するのは、lib サブディレクトリにある jmxtools.jar と jmxri.jar の 2つの jar ファイルです。

MBean インターフェイスの作成

まず最初に管理する側に公開する属性と操作を定義したインターフェイスを作成します。

今回は例として、メッセージを属性として持ち、それを標準出力に出力する操作を行うことが可能な「メッセージボックス」というものを作ってみました。
こちらがその公開された属性と操作です。

属性に対しては set/get メソッドを用意します。

操作については public のメソッドを用意します。

まず最初に用意したメソッドを定義したインターフェイスを作成します。
この時、インターフェイスの名前は「実装クラス名 + MBean」としてください。

package JMX_test;

public interface MessageBoxMBean {

public void setMessage(String msg);

public String getMessage();

public void printMessage();

}

javac でコンパイルします。

インターフェイス実装クラスの作成

インターフェイスを実装したものを作成します。

いくつかの決まりごとがあります。

上記の決まりごとに則っていれば、後は特に制約はありません。
今回は以下のように実装しました。

package JMX_test;

public class MessageBox implements MessageBoxMBean {

private String message = null;

public MessageBox() {
this.message = "こんにちは!! コンストラクタが作成したメッセージです。";
}

public MessageBox(String msg) {
this.message = msg;
}

public void setMessage(String msg) {
this.message = msg;
}

public String getMessage() {
return message;
}

public void printMessage() {
System.out.println( message );
}

}

javac でコンパイルします。
ちょっと順番が前後していますが、ここでの %CLASSPATH% は下のエージェントを作成する時に指定しているクラスパスになります。

エージェントの作成

これで管理対象となる「メッセージ」をハンドルする「MessageBox」という MBean が作成されました。
この MBean は MBean サーバーというものに登録されることによって、使用できるようになります。

package JMX_test;

import javax.management.*;
import com.sun.jdmk.comm.*;

public class MessageAgent {

public MessageAgent() {

MBeanServer mbs = MBeanServerFactory.createMBeanServer("MessageAgent");
HtmlAdaptorServer has = new HtmlAdaptorServer();
MessageBox msgbox = new MessageBox();

try {

ObjectName msgboxName = new ObjectName("MessageAgent:name=MessageBox");
mbs.registerMBean( msgbox, msgboxName );

ObjectName hasName = new ObjectName("MessageAgent:name=HTMLAdaptor, port=8082");
has.setPort(8082);
mbs.registerMBean( has, hasName );
has.start();

} catch (Exception e) {
e.printStackTrace();
}
}

public static void main( String args[] ) {
System.out.println("MessageAgent 実行中");
MessageAgent msgAgent = new MessageAgent();
}

}

MBean サーバーを作成するのは以下のようにします。引数として指定されているのはドメイン名で、MBean を管理する単位と考えてください。指定しなければデフォルトのドメインになります。

MBeanServer mbs = MBeanServerFactory.createMBeanServer("MessageAgent");

以上で作成された MBean サーバーに MBean を登録します。

MBean の新しいインスタンスを作成し、MBean を MBean サーバーの中で区別するための ID として ObjectName を作成し、その 2つを引数として MBean サーバーのインスタンスに対して registerMBean を実行します。

MessageBox msgbox = new MessageBox();
ObjectName msgboxName = new ObjectName("MessageAgent:name=MessageBox");
mbs.registerMBean( msgbox, msgboxName );

今回は Sun の JMX リファレンス実装についてきた HTML アダプターをプロトコル・アダプターとして使用します。

プロトコル・アダプターというものも MBean なので、上でみた MBean の登録と同じ手順で使用します。
プロトコル・アダプターのインスタンスを作成し、ObjectName を作成し、その 2つを引数として MBean サーバーのインスタンスに対して registerMBean を実行します。

HtmlAdaptorServer has = new HtmlAdaptorServer();
has.setPort(8082);
ObjectName hasName = new ObjectName("MessageAgent:name=HTMLAdaptor, port=8082");
mbs.registerMBean( has, hasName );
has.start();

javac でコンパイルします。

エージェントの実行

エージェントを実行してみましょう。

ブラウザーからのアクセス

上記の状態で、HTML アダプター経由での MBean へのアクセスが可能になっています。
プロトコル・アダプターを登録する時に設定したポートに、ブラウザーからアクセスしてみると、以下のような画面になります。

MessageAgent というドメインがあり、その中に MessageBox と HTMLアダプターが MBean として登録されているのがわかります。

上記の画面の「Admin」というボタンを押すと、新しい MBean を登録したり、今登録されている MBean を unregister したりするための画面がでてきます。

MBean の確認

MessageBox MBean をクリックすると、以下のような画面になります。

Message という Read/Write 可能な属性があり、現在の内容がどうなっているかが「List of MBean attributes:」にリストされています。

「List of MBean operations:」には printMessage というオペレーションが可能であることがリストされています。

操作の実行

printMessage ボタン (= オペレーション) をクリックすると以下のような画面になります。

MBean の実装で定義したとおり、現在の Message 属性の値が出力されます。

属性の変更

Message 属性を変更してみましょう。

「Value」のところに新しい値を入力して「Apply」ボタンを押します。

画面は変わりません。(URL が変わっているのがわかると思います)
確認のため、「printMessage」ボタンを押してみましょう。

新しい値が表示されているのが確認できます。

[Top Pageに戻る]

Ads by TOK2