先月に引き続き今月もJMX(Java Management Extensions)を用いたソフトウエア管理について解説していきます。

先月の記事を読んでいない方のために,さらっとおさらいをしておきましょう。

Javaではソフトウエア管理のフレームワークとしてJMXを使用します。JMXは以下に示す三つの要素から構成されます。

MBean 管理対象オブジェクトに対応する管理用オブジェクト
MBeanServer MBeanのコンテナ
Connector/Protocol Adapter 外部との通信を行うコンポーネント
ConnectorはJMXの独自プロトコル,Protocol AdapterはHTTPなどの既存プロトコルを使用する

先月はJVMに特化したMBeanであるMXBeanと簡易管理ツールのjconsoleを例にして,JMXを説明しました。

今月は,管理のためのMBeanを作成して,ソフトウエアを実際に管理してみます。

さっそく管理を行いたいのですが,その前に管理対象となるシステムがなければお話になりませんね。今回はJDK 5.0に含まれているサンプルのうち,New I/Oのサンプルである簡易HTTPサーバーを取りあげます。サンプルの実行にはJ2SE 5.0を使用し,Windows XP SP2で動作を確認しました。

まずは,このサンプルを動かしてみましょう。サンプルは[JDKをインストールしたディレクトリ]\sample\nio\serverディレクトリにあります(UNIX系のOSでは\を/に読みかえてください)。

このサンプルはソースファイルしか提供されていないので,はじめにコンパイルを行います。

>javac *.java 

実行する前に,カレント・ディレクトリにrootという名前のディレクトリを作成します。rootディレクトリには適当なHTMLファイルを配置しておきます。

このHTTPサーバーは,入出力の方法やスレッドの使い方により複数のモードを持っています。モードは起動時の引数によって指定します。ここではノンブロッキング,シングル・スレッドのモードで動作させてみましょう。N1がノンブロッキング,シングル・スレッドを表しています。

>java Server N1

デフォルトではポートは8000番になります。rootディレクトリにindex.htmlを配置したとすると,index.htmlをブラウズするためのURLはhttp://localhost:8000/index.htmlになります。

管理対象システムの変更

この簡易HTTPサーバーは管理されることを前提にしていないため,管理のための情報を取得できません。そこで,「HTTPサーバーを通してブラウズしたページのカウント」をJMXで管理できるように,簡易HTTPサーバーを変更します。

単純化のために,カウンタは一つにしました。トータルのページ・カウントを表すものです。どのWebページを見てもカウントが増加します。また,Webページに含まれるイメージもカウントします。

まずは,最低限の変更を加えて,トータルのページ・カウントを参照できるようにしてみましょう。

前述したように,この簡易HTTPサーバーは複数のモードを持ちます。ただ,すべてのモードを変更するのは大変なので,ノンブロッキングでシングル・スレッドを使用するモードだけを変更します。

ノンブロッキングI/Oはjava.nio.channels.Selectorクラスを使用して入出力の処理を行います。入出力の処理にはアクセプト,コネクト,入力,出力の4種類がありますが,これらはjava.nio.channels.SelectionKeyクラスで表されます。

WebブラウザからWebページにアクセスすると入力処理が行われるので,この処理が始まる個所にページ・カウントを増加させる処理を加えます。また,ページ・カウントを取り出すためのgetterメソッドも定義します。

実際にこの処理を行っているのはサンプルの中のDispatcher1.javaクラスです。該当個所を以下に示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
private void dispatch() throws IOException {
    sel.select();
    for (Iterator i = sel.selectedKeys().iterator();
            i.hasNext(); ) {
        SelectionKey sk = (SelectionKey)i.next();
        i.remove();
        Handler h = (Handler)sk.attachment();
        h.handle(sk);
    }
}

2行目のselがSelectorオブジェクトです。そこからSelectionKeyオブジェクトを取りだして,設定されたハンドラに処理を委譲しています。

skが入力処理を表している場合,ブラウザから送られたHTTPのGETコマンドの処理を行います。そこで,以下のように変更を加えてみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
private void dispatch() throws IOException {
    sel.select();
    for (Iterator i = sel.selectedKeys().iterator();
            i.hasNext(); ) {
        SelectionKey sk = (SelectionKey)i.next();
        i.remove();
 
        //skが入力処理ならば,ページ・カウントを増加させる
        if (sk.isReadable()) {
            increasePageCount();
        }
 
        Handler h = (Handler)sk.attachment();
        h.handle(sk);
    }
}

赤字が追加した部分です。SelectionKeyクラスのisReadableメソッドは,入力処理であるかどうかをチェックするためのメソッドです。10行目でコールしているincreasePageCountメソッドを次に示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
private int pageCount;
 
private synchronized void increasePageCount() {
    pageCount++;
}
 
public synchronized int getPageCount() {
    return pageCount;
}
 
public synchronized void resetPageCount() {
    pageCount = 0;
}

increasePageCountメソッドは単にpageCountをインクリメントするだけです。

increasePageCountメソッド以外にgetPageCountメソッドとresetPageCountメソッドを定義しました。

getPageCountメソッドはページ・カウントを読み出すためのもので,resetPageCountメソッドはページ・カウントをリセットするものです。これら三つのメソッドがすべてsynchronizedなのは,複数のスレッドからコールされる可能性があるためです。

また,Dispatcher1クラスはパッケージ・プライベート・クラスになっていますが,どのオブジェクトからでもアクセスできるようにパブリック・クラスに変更します。

さて,これで準備は整いました。来週からは実際にこのサンプルを使用して管理を行っていきましょう。

コラム J2SE 1.4.xでJMXを使用する

J2SE 1.4.xにはJMXが含まれていないため,単体でJMXを使用することはできません。しかし,Sun Microsystemsが提供しているJMXのReference Implementation(RI)やオープンソースで実装されているMX4Jなどを使用することができます。

ここでは Sunが提供しているRIをご紹介します。

JMX RIはSunのJMXのWebページからダウンロードできます。このページの左側のサイドバーにあるDownloadsのリンクから,ダウンロード・ページに移動します。ダウンロード・ページではJMX Remote 1.0.1_04 RI,JMX 1.2.1 RIなどがダウンロードできるようになっています。ここでは,原稿執筆時点(2006年2月)での最新版であるJMX 1.2.1 RIをダウンロードします。

ダウンロードしたjmx-1_2_1-ri.zipを展開すると,doc,example,libというディレクトリが作成されます。libディレクトリにjmxri.jarとjmxtools.jarがあるのを確認できるはずです。

jmxri.jarがJMXの本体です。jmxtools.jarにはHTTP Protocol Adapterなどが含まれています。

この二つのJARファイルをクラスパスに加えれば,JMXを使用できるようになり,ブラウザを使用して管理を行えます。

もし,HTML Protocol Adapterではなく,管理ツールにjconsoleを使用したい場合は,JMX Remote APIを使用してみてください。JMX RIと同じダウンロード・ページからダウンロードできます。

著者紹介 櫻庭祐一

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