Code Log

プログラミングの勉強メモを残していきます。

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です。

f:id:sho322:20141102170030j:plain

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を見てみましょう。

f:id:sho322:20141102170040j:plain

jmx-console上にサービスが登録されました。

メソッドの引数にファイルを指定して、invokeしてみます。

f:id:sho322:20141102170052j:plain

結果、ファイルの内容を読み込んで表示することができました!

f:id:sho322:20141102170100j:plain

JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド

JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド