JMX (Java Management Extensions)

JMXとはJava Management Extensionsの略で、アプリケーションやシステムオブジェクト、サービス指向ネットワークの管理と監視を行うツールを提供するJava技術です。この記事ではJMXの使い方をご紹介します。

JMXとは

JMX (Java Management Extensions)はアプリケーション、システムオブジェクト、デバイス及びサービス指向ネットワークの管理と監視を行うツールを提供するJava技術である。

JMXでは監視及び管理対象のリソースをMBeanと呼ばれるオブジェクトで表現して、アプリケーション側からはJMX Agent (MBean Server)を介してアクセスする。JMX Agentへのリモートアクセスは、通信プロトコルごとに用意されたConnectorと呼ばれる通信モジュールを介して行う。

MBean

JMXでは管理対象とするデバイス、アプリケーション又はリソースの属性及び操作をまとめたBeanで管理する。この管理対象BeanをMBeanと呼ぶ。

JConsole

JCconsole (Java Monitoring & Management Console)はJMX仕様に準拠した監視ツールである。jconsoleはJDK_HOME/binディレクトリに配置されている。

jconsole [-interval=n] [-notile] [-pluginpath path] [-version] [connection ...]

connectionには、次に示す形式で接続先を指定する。

pid|host:port|service:jmx:protocol://url

JConsoleには次に示すオプションを指定できる。

-interval=n
更新間隔をn秒に設定する。
-notile
最初にウィンドウを並べて表示しない。
-plaginpath path
JConsoleがプラグインを参照するために使用するパスを設定する。
-version
バージョン情報を表示する。

パッケージ

JMXには次のパッケージが用意されている。

javax.management
JMXの核となるクラスを提供するパッケージ
javax.management.openmbean
公開データ型とOpen MBean記述子クラスを提供するパッケージ
javax.management.remote
JMX Beanサーバにリモートアクセスするためのインタフェースを提供するパッケージ

javax.management

javax.managementはJMXの核となるクラスを提供するパッケージである。

javax.managementパッケージのインタフェース
インタフェース説明
MBeanServerConnectionMBeanサーバとの通信方法
javax.managementパッケージのクラス
クラス説明
JMXJMX APIからのstaticメソッド
ObjectNameMBeanのオブジェクト名
javax.managementパッケージの例外
例外説明
MalformedObjectNameException文字列の形式が有効なObjectNameに対応していない

javax.management.JMX

javax.management.JMXはJMX APIからのstaticメソッドを提供するクラスである。JMXクラスのインスタンスは存在しない。

JMXクラスのメソッド
MethodDescription
newMBeanProxyローカル又はリモートのMBeanサーバ内に標準MBeanプロキシを作成する。

javax.management.MBeanServerConnection

javax.management.MBeanServerConnectionはMBeanサーバとの通信方法を表すインタフェースである。

javax.management.ObjectName

javax.management.ObjectNameはMBeanのオブジェクト名、又は複数のMBean名に一致するパターンを表すクラスである。

javax.management.openmbean

javax.management.openmbeanは公開データ型とOpen MBean記述子クラスを提供するパッケージである。

javax.management.openmbeanパッケージのインタフェース
InterfaceDescription
TabularDataテーブルデータ構造を表す公開データ

javax.management.remote

javax.management.remoteはJMX Beanサーバにリモートアクセスするためのインタフェースを提供するパッケージである。

javax.management.remoteパッケージのインタフェース
InterfaceDescription
JMXConnectorJMX APIのクライアント側
javax.management.remoteパッケージのクラス
ClassDescription
JMXConnectorFactoryJMX APIコネクタクライアントを作成するファクトリ
JMXServiceURLJMX APIコネクタサーバのアドレス

javax.management.remote.JMXServiceURL

javax.management.remote.JMXServiceURLはJMX APIコネクタサーバのサービスURLを表すクラスである。

サービスURLは次に示す形式である。

service:jmx:protocol:sap

protocolはコネクタサーバに接続する際に使用する転送プロトコルである。

sapはコネクタサーバが検出されたアドレスで、次に示す形式である。

//[host[:port]][url]

javax.management.remote.JMXConnector

javax.management.remote.JMXConnectorはJMX APIコネクタのクライアント側を表すインタフェースである。

JMXConnectorのメソッド
MethodDescription
closeクライアントとサーバの接続を終了する。
getMBeanServerConnectionリモートMBeanサーバを表すMBeanServerConnctionオブジェクトを返す。

javax.management.remote.JMXConnectorFactory

javax.management.remote.JMXConnectorFactoryはJMX APIコネクタクライアントを作成するファクトリである。JMXConnectorFactoryクラスのインスタンスは存在しない。通常、JMXへの接続はJMXConnectorFactoryクラスのconnectメソッドにより確立される。

Jolokia

JolokiaとはMBeanにHTTP経由でアクセスできるエージェントである。応答はJSONで返ってくる。

JMXクライアントプログラムの例を次に示す。

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class JmxClient {
  public static void main(String[] args) {
    HashMap<String, String[]> environment = new HashMap<String, String[]>();
    String username = "karaf";
    String password = "karaf";
    String[] credentials = new String[] { username, password };
    environment.put("jmx.remote.credentials", credentials);

    try {
      JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/karaf-trun");
      JMXConnector jmxc = JMXConnectorFactory.connect(url, environment);
      MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
      String domains[] = mbsc.getDomains();

      for (int i = 0; i < domains.length; i++) {
        System.out.println("Domain[" + i + "] = " + domains[i]);
      }

      jmxc.close();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}