読者です 読者をやめる 読者になる 読者になる

「Spring」 MBeanExporter を使って MBean を登録する

Spring の MBeanExporter を使うと JMX API でごにょごにょすることなく Bean 定義ファイルだけで MBean の登録ができるみたいです。

・MBeanExporter (Spring Framework 4.2.4.RELEASE API)
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jmx/export/MBeanExporter.html

やることとしては、MBean 登録用のクラスの用意、Bean 定義ファイルの記述のみとかなり簡単です。以下のドキュメントにサンプルありますが、今回ちょっと触ってみたのでメモを残しておきます。

Spring Framework Reference Documentation
- 30. JMX
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#jmx


1.MBean 登録用のクラスの作成


以下のようにな簡単なクラスとしました。

■ Hello.java

package test.mbean;

public interface Hello {
  public void hello();
}

■ HelloMBean.java

package test.mbean;

public class HelloMBean implements Hello {
  private String name;
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  @Override
  public void hello() {
    System.out.println("Hello " + name);
  }

}

2. Bean 定義ファイルの記述


MBean クラス名あたりを変えているぐらいで、上記のドキュメントほぼままです。

■ applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        
    <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
        <property name="beans">
            <map>
                <entry key="bean:name=HelloMBean" value-ref="helloMBean"/>
            </map>
        </property>
    </bean>
    <bean id="helloMBean" class="test.mbean.HelloMBean">
        <property name="name" value="hoge"/>
    </bean>
</beans>


ひとまず、上記の状態で AP サーバ起動すれば MBean が登録されるはずです。jconsole なりで確認してもいいですが、せっかくなので今回は JMX クライアントなアプリケーション作って、そいつから hello を呼び出してみます。

3. JMX クライアントの作成


JBoss AS のドキュメントになりますが、以下に JMX クライアントのサンプルがあるのでこいつを参考に。

JMX subsystem configuration - JBoss AS 7.2 - Project Documentation Editor
https://docs.jboss.org/author/display/AS72/JMX+subsystem+configuration

MBean のオペレーションは MBeanServerConnection#invoke で実行できます。

・MBeanServerConnection (Java Platform SE 8 )
https://docs.oracle.com/javase/8/docs/api/javax/management/MBeanServerConnection.html

サンプルは以下の感じになります。

■ JMXClient.java

package test.mbean.client;

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 JXMClient {
  public static void main(String[] args) throws Exception {
    String urlString =
        System.getProperty("jmx.service.url","service:jmx:remoting-jmx://localhost:9999");
    JMXServiceURL serviceURL = new JMXServiceURL(urlString);
    JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL, null);
    MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();

    ObjectName on = new ObjectName("bean:name=HelloMBean");
    connection.invoke(on, "hello", null, null);
    
    // setName で name を変更して再度 hello を呼び出す
    connection.invoke(on, "setName", new Object[]{"uga"}, new String[]{String.class.getName()});
    connection.invoke(on, "hello", null, null);
    
    jmxConnector.close();
  }
}

※ %JBOSS_HOME%\bin\client\jboss-client.jar をクラスパスに設定してあげてください。これしないと "remoting-jmx" が理解できないみたいです。

Exception in thread "main" java.net.MalformedURLException: Unsupported protocol: remoting-jmx

実行すると JBoss のコンソールに以下のような出力がされるはずです。

23:57:53,658 INFO  [stdout] (pool-2-thread-1) Hello hoge
23:57:53,692 INFO  [stdout] (pool-2-thread-1) Hello uga


Spring 久しぶりに触りました。やっぱり定期的に触っておかないといろいろ忘れてるものですね・・・

以上になります。

[ 環境情報 ]
Windows 7 SP1
JBoss EAP 6.3
Java SE 8 Update 25