Archive

Archive for 2012年7月

JBoss AS7 – Admin Guide – Management tasks – Subsystem configuration – JMX subsystem configuration

JMX subsystem configuration

リモーティングエンドポイントに JMX サブシステムのサービスが登録されているため Remoting connector 経由での JMX アクセスが可能です。 

standalone モードではデフォルトで 9999 ポートでの JMX アクセスが可能ですが domain モードでは Remoting connector の有効化が必要です。 

下記のように service:jmx URL を使用した標準的な方法で Remoting connector にアクセスすることが可能です。

import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
 
public class JMXExample {
 
    public static void main(String[] args) throws Exception {
        //Get a connection to the JBoss AS MBean server on localhost
        String host = “localhost”;
        int port = 9999;  // management-native port
        String urlString =
            System.getProperty(“jmx.service.url”,”service:jmx:remoting-jmx://” + host + “:” + port);
        JMXServiceURL serviceURL = new JMXServiceURL(urlString);
        JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL, null);
        MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
 
        //Invoke on the JBoss AS MBean server
        int count = connection.getMBeanCount();
        System.out.println(count);
        jmxConnector.close();
    }
}

上記のサンプルを実行するには下記のスクリプトで行っているようにクラスパスを設定する必要があります。

!/bin/bash
# specify your AS7 folder
export YOUR_AS7_HOME=~/as7
java -classpath $YOUR_AS7_HOME/bin/client/jboss-client.jar:./ JMXExample

また、 jconsole を使用して接続することも可能です。

 jconsole を使う場合 $JBOSS_HOME/bin 中の jconsole.sh もしくは jconsole.bat スクリプトを使用するとリモート接続に必要なライブラリをクラスパスに設定可能です。

 

上記のコードを以下の観点で改良したものが https://github.com/duke4j/java/tree/master/jmx に置いてあります。

  • JMX 接続時の認証情報(管理者名/パスワード)の設定
  • JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES の設定
  • Maven でビルドできるようにしたい!
  • ちょっとだけ MBean をみてみよう!

コードはこんな感じ。

import java.util.HashMap;
import java.util.Map;
import javax.management.MBeanInfo;
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 Main {

    public static void main(String[] args) throws Exception {
        String urlString = “service:jmx:remoting-jmx://”
                + System.getProperty(“jmx.service.url”, “localhost:9999”);

        String[] credentials = {
                System.getProperty(“jboss.admin.name”, “admin”),
                System.getProperty(“jboss.admin.password”, “jboss”) };

        String[] objectNames = {
                System.getProperty(“jmx.object.name0”,
                        “jboss.msc:type=container,name=jboss-as”),
                System.getProperty(“jmx.object.name1”,
                        “jboss.as:subsystem=datasources,jdbc-driver=h2”),
                System.getProperty(“jmx.object.name2”,
                        “jboss.modules:type=ModuleLoader,name=ServiceModuleLoader-5”) };
        Map<String, Object> env = new HashMap<String, Object>();
        env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
                “org.jboss.remotingjmx.RemotingConnectorProvider”);
        env.put(JMXConnector.CREDENTIALS, credentials);

        JMXServiceURL serviceURL = new JMXServiceURL(urlString);
        JMXConnector jmxConnector = JMXConnectorFactory
                .connect(serviceURL, env);
        try {
            MBeanServerConnection connection = jmxConnector
                    .getMBeanServerConnection();
            int count = connection.getMBeanCount();
            System.out.println(“A long time ago in a galaxy far, far away…. “
                    + count + ” MBeans on the AS7….”);
            for (String objectName : objectNames) {
                MBeanInfo beanInfo = connection.getMBeanInfo(new ObjectName(
                        objectName));
                System.out.println(beanInfo);
            }
        } finally {
            jmxConnector.close();
        }
    }
}