【コラム】

Java API、使ってますか?

13 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262

13/60

JSR 262: Web Services Connector for Java Management Extensions Agents

JMX(Java Management Extensions)はJ2SE 5.0から導入された、JavaアプリケーションやJVMの状態を監視/管理するための技術である。現行のJMX仕様はJSR 3で定義されており、次期バージョンとなるJMX 2.0はJSR 255として仕様の策定が進められている。

JMXでは監視/管理対象のリソースをMBeanと呼ばれるオブジェクトで表現し、アプリケーション側からはJMX Agent(MBean Server)を介してアクセスする。JMX Agentにはリモートからアクセスすることもでき、そのための技術仕様は「JSR 160: JMX Remote API」としてまとめられている。JMX Agentへのリモートアクセスは、通信プロトコルごとに用意された"Connector"と呼ばれる通信モジュールを介して行う。

JSR 262はこのJMX Remote APIを拡張し、WebサービスでJMX AgentにアクセスするためのConnectorを提供する。すなわち、Javaアプリケーションの監視/管理をWebサービスプロトコル経由で行えるようにする仕様である。これを利用することでJAX-WSなどのWebサービスAPIを利用したJavaアプリケーションから容易にJMXにアクセスできるほか、WSDLをサポートしたJava以外のWebサービスアプリケーションからもJavaアプリケーションのリモート管理ができるようになる。

JSR 262は現在jcp.orgのサイトにてEarly Draftが公開されており、ちょうど23日にEarly Draft Review 2が終了したばかりである。また、java.net内にあるプロジェクトサイトにて参照実装のEarly Access 2が公開されている。

JSR 262の参照実装を試す

JSR 262の参照実装はプロジェクトサイトのドキュメント&ファイルセクションからダウンロードすることができる。配布ファイルはjsr形式で、これを任意の場所に保存してコマンドプロンプトからプロンプト1のように実行すればインストーラが起動する。

プロンプト1 JSR-262参照実装のインストール

> java -jar jsr262-ri.jar

あとはインストーラにしたがってライセンスに同意し、任意の場所にインストールすればよい。

図1 参照実装のインストール1 - ライセンスに同意

図2 参照実装のインストール2 - 任意の場所を指定

なお、JSR 262はJ2SE 5.0およびJava SE 6に対応している、また、それとは別にJAX-WS 2.1.1以降のバージョンが必要となる。JAX-WS 2.1.1の参照実装はJAX-WSのプロジェクトサイトよりダウンロードできる。

この参照実装にはライブラリとサンプルプログラムが含まれている。今回はこのサンプルプログラムのうち、もっとも基本的な「simple」フォルダにある例を動かしてみよう。なお、筆者はWindows XP Pro Service Pack 2およびJava SE 6 Update2という環境でテストしている。

まず、JSR 262のサンプルプログラムを実行するにはApache Antの1.6.x以降のバージョンが必要となる。加えて、JAVA_HOME環境変数にJDKがインストールしてあるフォルダを設定しておく。

サンプルにはAntビルド用のbuild.xmlが付属しているが、これはJDK 5.0用のものなので、JDK 6を使用している場合には若干の修正を加える必要がある。まず、参照実装をインストールした場所(以下、[PATHTOJSR262]と表記する)にあるlib\endorsedフォルダに、JAX-WS 2.1.1に含まれる.jarファイルをすべてコピーする。JAX-WS 2.1.1をインストールした場所のlibフォルダ以下に、jaxws-api.jarやjaxb-api.jarなどのファイルがあるはずだ。

次に各サンプルプログラムのbuild.xmlを修正し、java.endorsed.dirsシステムプロパティにlib\endorsedフォルダを指定するよう属性を追加する。「simple」の場合、サーバプログラム用とクライアントプログラム用のbuild.xmlがあり、それぞれリスト1、リスト2のようになる。

リスト1 サーバプログラムのbuild.xml([PATH_TO_JSR262]\samples\simple\server\build.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!--
 build.xml
 Copyright 2006 Sun Microsystems, Inc. All rights reserved.
 SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
<project name="SimpleAgent" default="all" basedir=".">
    <property name="liblocation" value="../../../lib"/>
    <property file="../../common/common.properties"/>
    <target name="init">  
    </target>
    <target name="all" depends="init">
        <javac srcdir="." includes="*.java"/>
        <java fork="true" classpath="${classpath}" classname="SimpleAgent">
            <!--<sysproperty key="java.util.logging.config.file" value="../../common/logging.properties"/>-->
            <sysproperty key="java.endorsed.dirs" value="../../../lib/endorsed"/>
        </java>
    </target>
</project>

リスト2 クライアントプログラムのbuild.xml([PATH_TO_JSR262]\samples\simple\client\build.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!--
 build.xml
 Copyright 2006 Sun Microsystems, Inc. All rights reserved.
 SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
<project name="SimpleClient" default="all" basedir=".">
    <property name="liblocation" value="../../../lib"/>
    <property file="../../common/common.properties"/>
    <target name="init">  
    </target>
    <target name="all" depends="init">
        <javac srcdir="." includes="SimpleClient.java"/>
        <java fork="true" classpath="${classpath}" classname="SimpleClient">
            <!-- <sysproperty key="java.util.logging.config.file" value="../../common/logging.properties"/>-->
            <sysproperty key="java.endorsed.dirs" value="../../../lib/endorsed"/>
        </java>
    </target>
</project>

プログラムのコンパイルおよび実行は、コマンドプロンプトからantコマンドを使用して行う。まず、プロンプト2のようにしてサーバプログラムを実行する。サーバプログラムが待機状態になったら、別のコマンドプロンプトからクライアントプログラムを実行し、「Hello World(s)!」と表示されたら接続成功(プロンプト3)。

プロンプト2 サーバプログラムの実行

[PATH_TO_JSR262]\samples\simple\server> ant
Buildfile: build.xml

init:

all:
    [javac] Compiling 3 source files
     [java] SimpleAgent started on service:jmx:ws://localhost:9998/jmxws. Waiting...

プロンプト3 クライアントプログラムの実行

[PATH_TO_JSR262]\samples\simple\client> ant
Buildfile: build.xml

init:

all:
    [javac] Compiling 1 source file
     [java] Received : Hello World(s)!
     [java] Connection closed.

BUILD SUCCESSFUL
Total time: 8 seconds

正しく実行できたら、サンプルプログラムの中身を見てみよう。まずサーバ側には、管理対象リソースを表すMBeanとしてSampleMBeanインタフェースおよびそれをimplementsしたSampleクラス、そしてJMX AgentであるSimpleAgentクラスが用意されている。MBeanはhelloプロパティと、その値を返すgetHello()メソッドを持つ(リスト3、リスト4)。

リスト3 SampleMBean.java

public interface SampleMBean
{
    /**
     * helloプロパティの値を返す
     */
    public String getHello();

}

リスト4 Sample.java

import javax.management.*;

public class Sample implements SampleMBean {

    /**
     * helloプロパティ
     */
    private String hello = "Hello World(s)!";

    public Sample() {
    }

    /**
     * helloプロパティの値を返す
     */
    public String getHello() {
        return hello;
    }

}

SimpleAgentクラスではMBeanサーバにSampleMBeanを登録し、Connectorサーバを生成してリモートからの接続を待ち受ける(リスト5)。Connectorサーバの生成はJMXConnectorServerFactoryクラスのnewJMXConnectorServer()メソッドを使用して行う。このとき第1引数にはJMXServiceURLオブジェクトを渡すが、そのプロトコルとして「ws」を指定している点に注意してほしい。こうすることで、ConnectorサーバはWebサービスによる接続を受け付けることができる。

リスト5 SimpleAgent.java

import javax.management.MBeanServer;
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class SimpleAgent {

    public static void main(String[] args) throws Exception {

        // ホスト名
        String host = "localhost";        
        // ポート番号
        int port = 9998;
        // URLパス
        String urlPath = "/jmxws";

        // MBeanサーバを取得
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

        // Sample MBeanを登録
        mbs.registerMBean(new Sample(), 
               new ObjectName(":type=Sample")); 

        // Connectorサーバを生成してスタート
        JMXConnectorServer server = 
                JMXConnectorServerFactory.
                newJMXConnectorServer(new JMXServiceURL("ws", host, 
                port, urlPath), null, mbs);       
        server.start();

        System.out.println("SimpleAgent started on " + server.getAddress() + 
                ". Waiting...");

        Thread.sleep(Long.MAX_VALUE);
    }
}

クライアント側プログラムとしては、サーバ側のSimpleAgentにConnectorを介して接続し、MBeanからhelloの値を取得するSimpleClientクラスが用意されている。ここでも、SimpleAgentのURLを表すJMXServiceURLを生成する際に、プロトコルとして「ws」を指定する。

リスト6 SimpleClient.java

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class SimpleClient {

    public static void main(String[] args) throws Exception {

        // ホスト名
        int port = 9998;
        // ポート番号
        String host = "localhost";
        // URLパス
        String urlPath = "/jmxws";

        // JMX AgentのURLを指定
        JMXServiceURL url = new JMXServiceURL("ws", host, port, urlPath);
        // Connectorに接続
        JMXConnector connector = JMXConnectorFactory.connect(url, null);

        // MBeanServerへのコネクションを取得
        MBeanServerConnection connection = connector.getMBeanServerConnection();

        // 属性を指定して値を取得
        ObjectName mbeanName = new ObjectName(":type=Sample");
        String value = (String) connection.getAttribute(mbeanName, "Hello");

        System.out.println("Received : " + value);

        connector.close();

        System.out.println("Connection closed.");
    }
}

JMX Remote APIでは、ConnectorもConnectorServerもインスタンスの生成はファクトリクラスによって行うようになっている。したがって使用するプロトコルの違いはこのファクトリの部分で吸収されるため、Webサービス経由でJMXを利用する場合にも、RMIなどを使った場合とまったく同様の手順でアクセスすることができる。

JSR 262の仕様はまだEarly Draftの段階なので今後も変更が加えられる可能性は十分にあるが、基本的なコンセプトについてはスペックリードであるEamonn McManus氏のブログこのエントリ にも詳しく解説されているので参考にしてほしい。

13/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。



人気記事

一覧

イチオシ記事

新着記事