Java

JMX Remote を使って WebLogic Server 9.x の MBean にアクセス

JMX の仕様は昔からありますが、それにアクセスする標準的な方法はしばらくなく、WLS6.0 〜 8.1 まで、BEA は独自に EJB / RMI をベースとした方法を提供していました。

しばらくすると、JMX Remote APIという仕様が策定されました。最近の WebLogic (9.x 以降)や Tomcat が対応しています。
WebLogic は JMX Remote API に対応したのに伴い従来のアクセス方法には対応しなくなった(みたい?)※で、虚無僧が WLS9.x で動かない(みたい?)とのことです。

で、勉強がてらドキュメントと睨めっこして可能な限りシンプルなコードを書いてみました。
従来の WLS の API との一番の違いは MBean のリモートスタブそのものを取得できないことです。
オブジェクト名と属性(getter)を指定して結果を取得する(MBeanServerConnection#getAttribute)か、オブジェクト名とメソッド名を指定してメソッド実行をする(MBeanServerConnection#invoke)ことになるようです。

・サンプルコード


import java.util.Properties;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class MBeanTest {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put(Context.SECURITY_PRINCIPAL, "weblogic");
props.put(Context.SECURITY_CREDENTIALS, "weblogic");
props.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
JMXConnector connector = JMXConnectorFactory.connect(
new JMXServiceURL("service:jmx:t3://localhost:7001/jndi/weblogic.management.mbeanservers.domainruntime"), props);
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName sr = new ObjectName("com.bea:Name=AdminServer,Location=AdminServer,Type=ServerRuntime");
System.out.println(connection.getAttribute(sr, "State"));
connector.close();
}
}

・実行イメージ

$ java -cp weblogic.jar:. MBeanTest
RUNNING
$

※ドキュメントでは旧API は「非推奨」ですが、〜WLS8.1 と WLS9.x では内部的な MBean の実装モデルが随分違います。なので、「枯れていない」ラッパー用のコードで一応使えるようになっているような状況と思われます。
「もう基本的にメンテはしないよ」という通常の「非推奨」とは違うレベルでお勧めできません。
参考:
・WLS9.2 – WebLogic Server MBean について
・WLS8.1 – WebLogic JMX サービスの概要

関連エントリ:
虚無僧2.0.3 リリース
JConsole で JBoss の MBean を監視
虚無僧2.0 – BSD ライセンスでリリース
@IT – Webアプリの問題点を「見える化」する7つ道具
虚無僧2.0