JBossのMBeanサービスを作ってjmx-consoleで表示みる。そして、sarファイルとは?
SARファイルとは、.sarの拡張子で作られるアーカイブファイルです。
jar,war,earと似たようなものです。
sarファイルは、アプリケーションサーバ内でそれぞれ独立したサービスとして起動します。
Sar(Service ARchive)という一つの単位でサービスを起動させる目的で、SARファイルは作られます。
JBossのサービスの設計はJMXを元にしています。
SARDeployerがJBossのサービスクラスをインスタンス化します。
JMXを通じてmanageble(管理できる)beanとして、サービス内のクラスはインスタンス化されて、JBossに登録されるわけです。
JBossのMBeanサービスを作ってみます。
参考にしたのは以下のサイトで、MBeanを作るサンプルが書かれています。
https://developer.jboss.org/wiki/ExampleHelloWorldService
元々のサンプルをEclipseの「既存のAntファイルを取り込む」機能を使って、改変して作りました。
やりたいことは、jmx-console上から引数でファイルのパスを渡して、そのファイルを読み込んでjmx-consoleのブラウザに表示することです。
使ったのはJBoss4です。
SARファイルのディレクトリ構成は以下のようになります。
JBOSS-EXAMPLE.SAR ├─com │ └─acme │ HelloWorldService.class │ HelloWorldServiceMBean.class │ ├─META-INF │ jboss-service.xml │ MANIFEST.MF │ └─sample └─mbean FileReaderService.class FileReaderServiceMBean.class
これをJBossのServer/対象のサーバセット/deploy
以下に配置することで、JBossがSARをホットデプロイしてくれます。
まずは、インターフェースとなるクラスを作ります。
この末尾はServiceMBeanとなっていなければいけません(MBeanだけでもいいかも。要確認)
FileReaderServiceMBean.java
public interface FileReaderServiceMBean extends ServiceMBean{ public String textReadAndDisplay(String path); public void setFilePath(String path); public String getFilePath(); // Lifecycle callbacks void start() throws Exception; void stop(); }
で、こいつを実装するクラス。
package sample.mbean; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import org.jboss.system.ServiceMBeanSupport; public class FileReaderService extends ServiceMBeanSupport implements FileReaderServiceMBean { private String filePath; public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public void start() throws Exception { System.out.println("START!!!"); textReadAndDesplay(); } public void stop() { System.out.println("STOP!!!"); } public String textReadAndDesplay() { StringBuilder sb = new StringBuilder(); try { BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString(); } public String textReadAndDisplay(String path) { StringBuilder sb = new StringBuilder(); try { BufferedReader reader = new BufferedReader(new FileReader(path)); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString(); } }
このサービスをJBossに認識させるためのMETA-INF/jboss-service.xml
<?xml version="1.0" encoding="UTF-8"?> <server> <mbean code="com.acme.HelloWorldService" name="acme.com:service=HelloWorld"> <attribute name="Message">Hello World</attribute> </mbean> <mbean code="sample.mbean.FileReaderService" name="sample.mbean:service=FileReader"> <attribute name="FilePath">C:\tmp\file.txt</attribute> </mbean> </server>
ビルドはAntを使ってやっていますので、build.xmlとbuild.properties
jboss.homeはJBossがインストールされているディレクトリをしています。
jboss.configはJBOSS_HOME/server以下のサーバセット名を指定します。
jboss.home=C:\\JBosses\\jboss-4.2.3.GA jboss.config=sample
<?xml version="1.0"?> <project name="jboss-example" default="deploy" basedir="C:\Users\hoge\Desktop\hellombean2"> <property file="build.properties"/> <path id="classpath"> <pathelement location="build"/> <fileset dir="${jboss.home}/lib"> <include name="*.jar"/> </fileset> <fileset dir="${jboss.home}/server/${jboss.config}/lib"> <include name="*.jar"/> </fileset> <fileset dir="${jboss.home}/server/${jboss.config}/deploy"> <include name="*.jar"/> <include name="*.sar"/> </fileset> </path> <target name="echo"> <echo>${jboss.home}</echo> <echo>${ant.java.version}</echo> </target> <path id="client.classpath"> <path refid="classpath"/> </path> <target name="compile" description="Compile the source"> <mkdir dir="build"/> <javac destdir="build" debug="on" deprecation="on" optimize="on" classpathref="classpath"> <src path="src"/> </javac> </target> <target name="dist" depends="compile" description="Package the application"> <copy todir="build"> <fileset dir="resources"/> </copy> <mkdir dir="dist"/> <jar jarfile="dist/${ant.project.name}.sar" basedir="build"/> </target> <target name="deploy" depends="dist" description="Deploy the application"> <copy todir="${jboss.home}/server/${jboss.config}/deploy"> <fileset dir="dist"/> </copy> </target> <target name="undeploy" description="Undeploy the application"> <delete file="${jboss.home}/server/${jboss.config}/deploy/${ant.project.name}.sar"/> </target> <target name="clean" depends="undeploy" description="Cleanup"> <delete dir="dist"/> <delete dir="build"/> </target> </project>
これで、
ant deployを実行すると、JBoss上にSARをデプロイしてくれます。
ant cleanで全てキレイに掃除してくれます。
で、JMX-CONSOLEを見てみましょう。
jmx-console上にサービスが登録されました。
メソッドの引数にファイルを指定して、invokeしてみます。
結果、ファイルの内容を読み込んで表示することができました!
JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド
- 作者: NTTオープンソースソフトウェアセンタ,レッドハット株式会社
- 出版社/メーカー: 技術評論社
- 発売日: 2013/06/22
- メディア: 大型本
- この商品を含むブログ (9件) を見る