JMXとはJava Management Extensionsの略で、アプリケーションやシステムオブジェクト、サービス指向ネットワークの管理と監視を行うツールを提供するJava技術です。この記事ではJMXの使い方をご紹介します。
JMX (Java Management Extensions)はアプリケーション、システムオブジェクト、デバイス及びサービス指向ネットワークの管理と監視を行うツールを提供するJava技術である。
JMXでは監視及び管理対象のリソースをMBeanと呼ばれるオブジェクトで表現して、アプリケーション側からはJMX Agent (MBean Server)を介してアクセスする。JMX Agentへのリモートアクセスは、通信プロトコルごとに用意されたConnectorと呼ばれる通信モジュールを介して行う。
JMXでは管理対象とするデバイス、アプリケーション又はリソースの属性及び操作をまとめたBeanで管理する。この管理対象BeanをMBeanと呼ぶ。
MBeanは、管理対象となるリソースのインターフェースを定義する。インターフェース名は、クラス名の末尾に MBean をつけるのが慣例となっている。
public interface HelloMBean {
public void sayHello();
public String getName();
public void setName(String name);
}
MBeanインターフェースを実装するクラスを作成する。このクラスが、実際に管理されるリソースである。
public class Hello implements HelloMBean {
private String name = "World";
@Override
public void sayHello() {
System.out.println("Hello, " + name + "!");
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
MBeanServerにMBeanを登録し、JMXクライアントからアクセスできるようにする。このコードを実行すると、JMXコンソール(jconsole や JVisualVM など)から、Hello MBeanの属性や操作を確認・変更できる。
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
public class Main {
public static void main(String[] args) throws Exception {
// MBeanServerのインスタンスを取得
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// MBeanの名前を定義 (ドメイン:キー=値)
ObjectName name = new ObjectName("com.example:type=Hello");
// MBeanのインスタンスを作成
Hello mbean = new Hello();
// MBeanServerにMBeanを登録
mbs.registerMBean(mbean, name);
System.out.println("MBeanが登録されました。JMXクライアントで確認してください。");
System.out.println("プログラムを終了するにはCtrl+Cを押してください。");
// プログラムを終了させないように待機
Thread.sleep(Long.MAX_VALUE);
}
}
$ javac Main.java
$ java Main
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には次に示すオプションを指定できる。
JMXには次のパッケージが用意されている。
java.lang.managementには、以下に示すクラスがある。
クラス | 説明 |
---|---|
ManagementFactory | Javaプラットフォームの管理対象Beanを取得するためのファクトリ・クラス |
ManagementFactoryクラスは、Javaプラットフォームの管理対象Beanを取得するためのファクトリ・クラスである。
メソッド | 説明 |
---|---|
getPlatformMBeanServer() | プラットフォームMBeanServerを返す。 |
プラットフォームMBeanServerを返す。
public static MBeanServer getPlatformMBeanServer()
javax.managementは、JMXの核となるクラスを提供するパッケージである。
javax.managementパッケージには、以下に示すインタフェースがある。
インタフェース | 説明 |
---|---|
MBeanServerConnection | MBeanサーバとの通信方法 |
javax.managementパッケージには、以下に示すクラスがある。
クラス | 説明 |
---|---|
JMX | JMX APIからのstaticメソッド |
ObjectName | MBeanのオブジェクト名 |
javax.managementパッケージには、以下に示す例外がある。
例外 | 説明 |
---|---|
MalformedObjectNameException | 文字列の形式が有効なObjectNameに対応していない |
javax.management.MBeanServerConnectionはMBeanサーバとの通信方法を表すインタフェースである。
javax.management.JMXはJMX APIからのstaticメソッドを提供するクラスである。JMXクラスのインスタンスは存在しない。
Method | Description |
---|---|
newMBeanProxy | ローカル又はリモートのMBeanサーバ内に標準MBeanプロキシを作成する。 |
javax.management.ObjectNameはMBeanのオブジェクト名、又は複数のMBean名に一致するパターンを表すクラスである。
javax.management.openmbeanは公開データ型とOpen MBean記述子クラスを提供するパッケージである。
Interface | Description |
---|---|
TabularData | テーブルデータ構造を表す公開データ |
javax.management.remoteはJMX Beanサーバにリモートアクセスするためのインタフェースを提供するパッケージである。
Interface | Description |
---|---|
JMXConnector | JMX APIのクライアント側 |
javax.management.remote.JMXConnectorはJMX APIコネクタのクライアント側を表すインタフェースである。
Method | Description |
---|---|
close | クライアントとサーバの接続を終了する。 |
getMBeanServerConnection | リモートMBeanサーバを表すMBeanServerConnction オブジェクトを返す。 |
Class | Description |
---|---|
JMXConnectorFactory | JMX APIコネクタクライアントを作成するファクトリ |
JMXServiceURL | JMX APIコネクタサーバのアドレス |
javax.management.remote.JMXConnectorFactoryはJMX APIコネクタクライアントを作成するファクトリである。JMXConnectorFactoryクラスのインスタンスは存在しない。通常、JMXへの接続はJMXConnectorFactoryクラスのconnect
メソッドにより確立される。
javax.management.remote.JMXServiceURLはJMX APIコネクタサーバのサービスURLを表すクラスである。
サービスURLは次に示す形式である。
service:jmx:protocol:sap
protocolはコネクタサーバに接続する際に使用する転送プロトコルである。
sapはコネクタサーバが検出されたアドレスで、次に示す形式である。
//[host[:port]][url]
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();
}
}
}