先週はStandard MBeanの定義を行い,MBeanの生成,MBeanServerへの登録までを説明しました。今週はいよいよ,サンプルの簡易HTTPサーバーを実行して,実際に管理を行ってみましょう。

>java -Dcom.sun.management.jmxremote Server N1
jconsole の起動
図1 jconsoleの起動
MBean の一覧
図2 MBeanの一覧

まずサンプルを起動し,続いてjconsoleを立ちあげます。するとダイアログにサンプルのクラスと引数が列挙されます(図1)。ここでServer N1を選択して接続します。

jconsoleが起動したら,[MBean]タグを選択してみてください。左側のツリーの部分にちゃんとsampleというドメインが表示されているはずです。

これを展開すると,dispatcherが表示されます(図2)。このツリーにはObjectNameオブジェクトで指定したname属性が表示されます。

サンプルにはConnectorの設定を行っていませんが,javaの起動時オプション「-Dcom.sun.management.jmxremote」を指定するだけで,ここで示したようにMBeanを参照することができます。

この起動時オプションを指定すると,サンプルの実行の前に次のような動作が行なわれます。

  1. MBeanServerの生成
  2. MXBean群の生成,MBeanServerへの登録
  3. Connectorの生成,MBeanServerへの登録
  4. Connectorの起動

先週,変更を行なったN1クラスでは,MBeanServerFactoryクラスのfindMBeanServerメソッドを使用して,すでに作成されたMBeanServerオブジェクトがないかどうかを調べています。

この時,すでにMXBeanとConnectorが登録されたMBeanServerオブジェクトが存在するので,そこにDispacherInfoMBeanオブジェクトを登録しています。

したがって,Connectorを設定しなくても,jconsoleからMBeanにアクセスできるわけです。

dispatcherの属性
図3 dispatcherの属性

さて,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で作成されています。

HTTP Protocol Adapter dispatcher
図4 HTTP Protocol Adapter 図5 dispatcherの情報画面
Tomcatの管理画面
図6 Tomcatの管理画面

著者紹介 櫻庭祐一

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