レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

CoherenceのMbeanにJMXで接続するサンプル

久々に技術ブログを書きたくなったので、Coherenceネタでも一つ。

Coherenceはドキュメントがしっかりしてるんだけど、結構重要なMbeanアクセスのサンプルが
Webに落ちてなくて四苦八苦したので、そのサンプルを提供。

まずはcoherence.jarをクラスパスにいれてください。

で、以下がJavaのコード

RemoteMbeanAccess.java

package com.example.coherence.jmx;

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 RemoteMbeanAccess {

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

		String host = "localhost";
		String registryport = "9000";
		String connectionport="3000";
		String url = "service:jmx:rmi://" + host + ":" + connectionport + "/jndi/rmi://" + host + ":" + registryport + "/server";

		System.out.println(url);
		JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(url));
		MBeanServerConnection server = connector.getMBeanServerConnection();

		System.out.println( server.getMBeanCount());
		System.out.println("connection id = "+ connector.getConnectionId());
		System.out.println("connection domain = "+ connector.getMBeanServerConnection().getDefaultDomain());

		String name = (String)server.getAttribute(new ObjectName("Coherence:type=Cluster"),"ClusterName");
		System.out.println(name);

		Integer cacheSize = (Integer)server.getAttribute(new ObjectName("Coherence:type=Cache,service=DistributedCache,name=test,nodeId=1,tier=back"),"Size");
		System.out.println(cacheSize);
		connector.close();
	}
}

クラスタ名とキャッシュサイズを取得して返すだけです。

で、キャッシュサーバーを立ち上げるのはもちろんながら、MBeanコネクターサーバというのを立ち上げる必要もあります。
以下コマンド(Windows用)

1.キャッシュサーバーの起動コマンド(Windows用)

@echo off
set coherence_home=%~dp0
set memory=512m
set java_opts=-Xms%memory% -Xmx%memory% %jmxproperties%
java %java_opts% -cp "%coherence_home%\lib\coherence.jar" com.tangosol.net.DefaultCacheServer
@echo on

2.MBeanコネクターサーバの起動(Windows用)

→ホスト、ポートはデフォルトになっています。cmdファイル内でjavaの起動引数を設定していますので適宜変更ください。

@echo off
set coherence_home=%~dp0
echo "%coherence_home%"
set memory=256m
set jmxproperties=-Dtangosol.coherence.management=all
set jmxproperties=%jmxproperties% -Dcom.sun.management.jmxremote.ssl=false
set jmxproperties=%jmxproperties% -Dcom.sun.management.jmxremote.authenticate=false
set jmxproperties=%jmxproperties% -Dtangosol.coherence.management.remote.host=localhost
set jmxproperties=%jmxproperties% -Dtangosol.coherence.management.remote.registryport=9000
set jmxproperties=%jmxproperties% -Dtangosol.coherence.management.remote.connectionport=3000
set java_opts=-Xms%memory% -Xmx%memory% %jmxproperties%
java %java_opts% -cp "%coherence_home%\lib\coherence.jar" com.tangosol.net.management.MBeanConnector -rmi

@echo on

3.Javaプログラムからアクセスするために上記「RemoteMbeanAccess」のmainメソッドを実行します。

JMXのオブジェクトの指定方法は
この部分→(new ObjectName("Coherence:type=Cache,service=DistributedCache,name=test,nodeId=1,tier=back"),"Size")
ですが、ここはドキュメントをみながら、JConsoleで一度つないでオブジェクトを参照してみると欲しい情報へのパスが載ってるので上手く書き換えてつかってくださいな。

ではまた。