「Java」JMX さわってみた

JMX さわってみたので、その時のメモ。

[ 環境情報 ]
Windows 7 SP1
Java SE 7 Update 45

オラクルからは以下のドキュメントが提供されてます。

・Trail: Java Management Extensions (JMX) (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/jmx/index.html

上記のドキュメントから辿れますが、以下あたりにサンプルコードが載ってます。

・Standard MBeans (The Java Tutorials > Java Management Extensions (JMX) > Introducing MBeans)
http://docs.oracle.com/javase/tutorial/jmx/mbeans/standard.html

やることとしては、
-----
1. MBean インタフェースの作成
2. インタフェースの実装クラスの作成
3. JMX Agent の作成
-----
って感じみたいです。


サンプルコード参考にさっそくやってみました。

1. MBean インタフェースの作成
■ HelloMBean.java

package com.example;

public interface HelloMBean {
	public String getHello();
	public void sayHello();
}


2. インタフェースの実装クラスの作成
■ Hello.java

package com.example;

public class Hello implements HelloMBean {
	public void sayHello() {
		System.out.println("sayHello !!");
	}
	public String getHello() {
		return "getHello !!";
	}
}


3. JMX Agent の作成
■ JMXAgent.java

package com.example;

import java.lang.management.ManagementFactory;

import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;

public class JMXAgent {
	public static void main(String[] args) {
		try {
			MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
			ObjectName name = new ObjectName("com.example:type=Hello");
			Hello mbean = new Hello();
			mbs.registerMBean(mbean, name);

			System.out.println("Waiting forever...");
			Thread.sleep(Long.MAX_VALUE);
		} catch (MalformedObjectNameException e) {
			e.printStackTrace();
		} catch (NotCompliantMBeanException e) {
			e.printStackTrace();
		} catch (MBeanRegistrationException e) {
			e.printStackTrace();
		} catch (InstanceAlreadyExistsException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

上記で MBean の登録まで完了です。
jconsole を起動して [ MBean ] タブを見ると登録した MBean が確認できます。


jconsole で確認するのもいいのですが、せっかくなんでコードから Mbean の情報取得したいなと。
なので調べてみました。

・Creating a Custom JMX Client (The Java Tutorials > Java Management Extensions (JMX) > Remote Management)
http://docs.oracle.com/javase/tutorial/jmx/remote/custom.html

※「jmx_examples.zip」クリックするとダウンロードできる "Client.java" を参考に。

■ JMXClient.java

package com.example;

import java.io.IOException;

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

public class JMXClient {
	public static void main(String[] args) {
		try {
			JMXConnector jmxc = JMXConnectorFactory.connect(new JMXServiceURL(
					"service:jmx:rmi:///jndi/rmi://:9999/jmxrmi"));
			MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
			ObjectName mbeanName = new ObjectName("com.example:type=Hello");
			HelloMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName,
					HelloMBean.class, true);

			String hello = mbeanProxy.getHello();
			System.out.println(hello);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (MalformedObjectNameException e) {
			e.printStackTrace();
		}
	}
}

JMXAgent.java は以下のオプション付けて起動しておく。

-Dcom.sun.management.jmxremote.port=9999  -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

JMXClient.java を実行するとコンソールに

getHello !!

が出力される。MBean の情報取得できてますね。

以上です。