「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 久しぶりに触りました。やっぱり定期的に触っておかないといろいろ忘れてるものですね・・・
以上になります。