先週はStandard MBeanの定義を行い,MBeanの生成,MBeanServerへの登録までを説明しました。今週はいよいよ,サンプルの簡易HTTPサーバーを実行して,実際に管理を行ってみましょう。
>java -Dcom.sun.management.jmxremote Server N1
まずサンプルを起動し,続いてjconsoleを立ちあげます。するとダイアログにサンプルのクラスと引数が列挙されます(図1)。ここでServer N1を選択して接続します。
jconsoleが起動したら,[MBean]タグを選択してみてください。左側のツリーの部分にちゃんとsampleというドメインが表示されているはずです。
これを展開すると,dispatcherが表示されます(図2)。このツリーにはObjectNameオブジェクトで指定したname属性が表示されます。
サンプルにはConnectorの設定を行っていませんが,javaの起動時オプション「-Dcom.sun.management.jmxremote」を指定するだけで,ここで示したようにMBeanを参照することができます。
この起動時オプションを指定すると,サンプルの実行の前に次のような動作が行なわれます。
- MBeanServerの生成
- MXBean群の生成,MBeanServerへの登録
- Connectorの生成,MBeanServerへの登録
- Connectorの起動
先週,変更を行なったN1クラスでは,MBeanServerFactoryクラスのfindMBeanServerメソッドを使用して,すでに作成されたMBeanServerオブジェクトがないかどうかを調べています。
この時,すでにMXBeanとConnectorが登録されたMBeanServerオブジェクトが存在するので,そこにDispacherInfoMBeanオブジェクトを登録しています。
したがって,Connectorを設定しなくても,jconsoleからMBeanにアクセスできるわけです。
さて,dispatcherを選択すると,このMBeanの属性が表示されます(図3)。MBeanのインタフェースにgetter/setterメソッドがあると,それは自動的に属性として扱われます。
DispacherInfoMBeanインタフェースではgetPageCountメソッドを定義したので,PageCountが属性として扱われています。
もう一つ定義したresetPageCountメソッドはどこにあるのでしょう。[操作]タグを表示させると,ちゃんとresetPageCountが表示されます。
サンプルのHTTPサーバーのWebページをブラウズしてから,jconsoleの[更新]ボタンをクリックしてみてください。PageCountの値が変更されているはずです。
また,[操作]タグに表示されるresetPageCountを実行してみてください。PageCountが0にリセットされるのがおわかりになると思います。
コラム HTTP Protocol Adapterを使用する場合
本記事ではConnectorを使用して外部の管理ツールからMBeanにアクセスを行っています。
しかし,Connector以外のProtocol Adapterを使用してもMBeanにアクセスすることは可能です。
ここではSunのJMX RIに含まれているHTTP Protocol Adapterを使用してみましょう。HTTP Protocol Adapterを使用する場合,N1クラスのrunServerメソッドは次のようになります(赤字が変更分)。
void runServer() throws Exception {
Dispatcher1 d = new Dispatcher1();
// MBeanを作成
DispatcherInfo info = new DispatcherInfo(d);
ObjectName name = new ObjectName(DISPATCHER_NAME);
// MBeanServerがすでに生成されていれば,それを使用する
// なければ新しく生成
MBeanServer server;
List servers
= MBeanServerFactory.findMBeanServer(null);
if (servers.size() > 0) {
server = (MBeanServer)servers.get(0);
} else {
server=MBeanServerFactory.createMBeanServer();
}
// MBeanを登録
server.registerMBean(info, name);
// HTTP Protocol Adapterを生成/登録
HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
server.registerMBean(adaptor,
new ObjectName("adaptor:name=adaptor,port=8082"));
adaptor.start();
d.register(ssc, SelectionKey.OP_ACCEPT,
new AcceptHandler(ssc, d, sslContext));
d.run();
}
HTTP Protocol Adapterで使用するポートはObjectNameオブジェクトの中で指定します。ここではport=8082と記述したので,ポートは8082番になります。
実行時にはクラスパスにjmxtools.jarを加えます。
>java -cp jmxtools.jar;. Server N1
さっそく,http://localhost:8082/をブラウズしてみましょう(図4)。MBeanの一覧が並んでいるので,dispatcherを選択します。すると図5のような表示に切り替わります。
表示されている要素はjconsoleと同じものになることがおわかりになると思います。
JMX RIに含まれているHTTP Protocol Adapterは必要最低限の機能しかありません。これに対してオープンソースのMX4Jでは,より高機能なHTTP Protocol Adapterを提供しています。例えば,XSLTを組みこんでページをデザインできるようになっています。
MX4JはTomcatなどでも使われているので,意識していなくてもHTTP Protocol Adapterで作成されているページをご覧になったことがあるかもしれません。図6はTomcatの管理ページですが,これもMX4JのHTTP Protocol Adapterで作成されています。
著者紹介 櫻庭祐一 横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名 |