JBossでは、MBeanというものを使うことが出来ます。
MBeanを使うと、HTTPなどを通してJavaのロジックを呼び出す事が出来ます。
他にも、cron(Windowsのタスクスケジューラ)のように
一定時間毎に特定の処理を実行することも可能になります。
なお、JDK5ではMBeanなどを含めたJMX(Java Management Extensions)が標準採用になっています。
MBeanを使うには、sarファイルを作成する必要があります。
詳しくは「アプリケーションファイル構成」のページを参考にして下さい。
ここでは、以下のような jboss-service.xml を作成することにします。
MBeanを一つだけ持つシンプルな構成です。
<server>
<mbean code="org.limy.mbean.Hello"
name="jboss.test:service=Hello">
</mbean>
</server>
MBeanは、EJBなどと同じように
MBeanも実体とインターフェイスが別々に定義されています。
今回では、HelloMBean がインターフェイス、Hello がそれを実装したクラスになります。
インターフェイス名は、「MBean名 + MBean」で統一するのが決まり事のようです。
インターフェイスは ServiceMBean の派生インターフェイス、
MBeanクラスは ServiceMBeanSupport の派生クラスである必要があります。
今回の例では
public interface HelloMBean extends ServiceMBean; public class Hello extends ServiceMBeanSupport implements HelloMBean;
のようになります。
MBeanクラス、MBeanインターフェイス共に
必ず定義しなければいけないメソッド等はありません。
両方を空定義にしても、登録のみは行うことが出来ます。
当然実際に使用するときには、何らかのメソッドを定義することになります。
可視性を public にして、あらゆるメソッドを定義する事が出来ます。
ただし、メソッド名は一定の決め事を守る必要があります。
getXXX / setXXX というメソッド名にします。
通常のJavaBeanクラスと同じです。
任意のメソッド名(ただし先頭はget/set以外)を付ける事が出来ます。
sarファイルをデプロイすることによって、MBeanが登録されます。
確認はJBossのJMXコンソール画面から行います。
URLは以下の通りです。
http://localhost:8080/jmx-console
ここに、登録されたMBeanが表示されているはずです。
MBean登録名の : の前方はカテゴリ名として認識されます。
今回の例で言うと「jboss.test」となります。
コンソール画面では、MBeanがカテゴリ毎に表示されます。
JBossには、スケジューリング管理されたMBeanを使うことが出来ます。
具体的には、Scheduler というMBeanが用意されているのでこれを使います。
<mbean code="org.jboss.varia.scheduler.Scheduler" name="jboss.docs.chap10:service=Scheduler"> <attribute name="StartAtStartup">true</attribute> <attribute name="SchedulableClass">org.jboss.chap10.ex2.ExSchedulable</attribute> <attribute name="SchedulableArguments">TheName,123456789</attribute> <attribute name="SchedulableArgumentTypes">java.lang.String,long</attribute> <attribute name="InitialStartDate">NOW</attribute> <attribute name="SchedulePeriod">60000</attribute> <attribute name="InitialRepetitions">-1</attribute> </mbean>
各要素の意味は以下の通りです。
デプロイ時にタスクをスタートさせる場合は true にします。false にした場合、MBeanの startSchedule メソッドを手動で呼び出す必要があります。
タスクに使用するクラスを指定します。
このクラスは、Schedulable インターフェイスを実装している必要があります。
このインターフェイスには以下のメソッドが定義されています。
public void perform(Date now, long remainingRepetitions);
タスククラスでは、このメソッドを実装する必要があります。
タスククラスのインスタンスを初期化するときに呼び出す
コンストラクタの引数値をカンマ区切りで記述します。
コンストラクタの引数型をカンマ区切りで記述します。
完全限定クラス名もしくはプリミティブ型名を使用できます。
タスクを開始する日付を記述します。NOW と記述すれば、デプロイ後すぐにタスクを開始します。
タスクが呼び出される間隔をミリ秒単位で指定します。
タスクを呼び出す最大回数を指定します。-1 を指定すると、タスクは無制限に呼び出されます。