hatenob

プログラムって分からないことだらけ

JBossにMBeanを乗せてJMXでアクセス

JBossにMBeanを乗っけて、それをJMXからアクセスするにはどうしたらよいのかしら?と調べました。
sar(Service Archive)形式でデプロイすればよい模様だということは分かったので、とりあえず適当に作って乗せてみる。

JBossはEAP6.1.0をコミュニティのところからダウンロードしました。
JBoss Application Server Downloads - JBoss Community

英語でよく分かんないけれど、とりあえずここのサイトでそれっぽいことをやってるのを発見。
How to create a Service Archieve SAR file in JBoss AS7 « JBoss

つまるところ、

  • XXXXMBeanという名前のinterfaceを作る。
  • XXXXという名前のclassを作って、interfaceをimplementsする。
  • META-INF/jboss-service.xmlにclassとnameを書く。

だけやって、デプロイすれば良さそうということでやったらそのままできました。

// MBean interface
public interface CounterMBean {
	int getCount();
	void increment();
}

// MBean
public class Counter implements CounterMBean {
	private AtomicInteger counter = new AtomicInteger(0);

	@Override
	public int getCount() {
		return counter.get();
	}

	@Override
	public void increment() {
		counter.incrementAndGet();
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<server xmlns="urn:jboss:service:7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="urn:jboss:service:7.0 jboss-service_7_0.xsd">

	<mbean code="com.github.chanko.mbean.Counter" name="com.github.chanko:service=Counter">
	</mbean>

</server>

ソースコードはコチラ。
chanko/chanko-mbean at master · nobrooklyn/chanko · GitHub

JConsoleで開くとちゃんと出てきて、属性の読み取りと、メソッドの実行ができて、ちゃんとカウントアップしていきました。

インタフェース名の末尾はMBeanじゃないとダメみたい。

これだけでじゃあ何ができるのかって、別にカウントアップするだけの話なのですれども、例えば色んなアプリケーションからこいつを突っついてグローバルな変数みたいな扱い方ができるので、何かの統計を取ったり、何かのフラグに使ったりって使い方ができるのかなぁと思います。

ちなみにJBossは何もしなくても、Servletのリクエスト回数とかの統計を取ることができますので、そんなのをわざわざ作る必要はないのでご注意を。