第8章 JBoss EAP MBean サービス

管理対象 Bean (単に MBean と呼ばれることもあります) は、依存関係インジェクションで作成された JavaBean の型です。MBean サービスは JBoss EAP サーバーの中心的な要素です。

8.1. JBoss MBean Service の記述

JBoss サービスに依存するカスタム MBean サービスを記述するには、サービスインターフェースメソッドパターンが必要です。JBoss MBean のサービスインターフェースメソッドパターンは createstartstop、および destroy が実行可能である場合に MBean サービスに通知する複数のライフサイクル操作で構成されます。

以下の方法を使用すると依存関係の状態を管理できます。

  • MBean で特定のメソッドを呼び出したい場合は、これらのメソッドを MBean インターフェースで宣言します。この方法では、MBean 実装で JBoss 固有クラスの依存関係を回避できます。
  • JBoss 固有クラスの依存関係を気にしない場合は、MBean インターフェースで ServiceMBean インターフェースおよび ServiceMBeanSupport クラスを拡張できます。ServiceMBeanSupport クラスは create、start、および stop などのサービスライフサイクルメソッドの実装を提供します。start() イベントなどの特定のイベントを処理するには、ServiceMBeanSupport クラスによって提供される startService() メソッドをオーバーライドする必要があります。

8.1.1. 標準の MBean の例

ここでは、サービスアーカイブ (.sar) で一緒にパッケージ化される 2 つの MBean サービスの例を開発します。

ConfigServiceMBean インターフェースは startgetTimeout、および stop などの特定のメソッドを宣言し、JBoss 固有のクラスを使用せずに MBean に対して starthold、および stop を実行します。ConfigService クラスは ConfigServiceMBean インターフェースを実装した後、このインターフェース内で使用されたメソッドを実装します。

PlainThread クラスは ServiceMBeanSupport クラスを拡張し、PlainThreadMBean インターフェースを実装します。PlainThread はスレッドを開始し、ConfigServiceMBean.getTimeout() を使用してスレッドのスリープ時間を決定します。

例: MBean サービスクラス

package org.jboss.example.mbean.support;
public interface ConfigServiceMBean {
    int getTimeout();
    void start();
    void stop();
}
package org.jboss.example.mbean.support;
public class ConfigService implements ConfigServiceMBean {
    int timeout;
    @Override
    public int getTimeout() {
        return timeout;
    }
    @Override
    public void start() {
        //Create a random number between 3000 and 6000 milliseconds
        timeout = (int)Math.round(Math.random() * 3000) + 3000;
        System.out.println("Random timeout set to " + timeout + " seconds");
    }
    @Override
    public void stop() {
        timeout = 0;
    }
}

package org.jboss.example.mbean.support;
import org.jboss.system.ServiceMBean;
public interface PlainThreadMBean extends ServiceMBean {
    void setConfigService(ConfigServiceMBean configServiceMBean);
}

package org.jboss.example.mbean.support;
import org.jboss.system.ServiceMBeanSupport;
public class PlainThread extends ServiceMBeanSupport implements PlainThreadMBean {
    private ConfigServiceMBean configService;
    private Thread thread;
    private volatile boolean done;
    @Override
    public void setConfigService(ConfigServiceMBean configService) {
        this.configService = configService;
    }
    @Override
    protected void startService() throws Exception {
        System.out.println("Starting Plain Thread MBean");
        done = false;
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (!done) {
                        System.out.println("Sleeping....");
                        Thread.sleep(configService.getTimeout());
                        System.out.println("Slept!");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        thread.start();
    }
    @Override
    protected void stopService() throws Exception {
        System.out.println("Stopping Plain Thread MBean");
        done = true;
    }
}

jboss-service.xml 記述子は、inject タグを使用して ConfigService クラスが PlainThread クラスにインジェクトされる方法を示します。inject タグは PlainThreadMBeanConfigServiceMBean 間の依存関係を確立し、PlainThreadMBean が簡単に ConfigServiceMBean を使用できるようにします。

例: JBoss-service.xml サービス記述子

<server xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:jboss:service:7.0 jboss-service_7_0.xsd"
        xmlns="urn:jboss:service:7.0">
 <mbean code="org.jboss.example.mbean.support.ConfigService" name="jboss.support:name=ConfigBean"/>
 <mbean code="org.jboss.example.mbean.support.PlainThread" name="jboss.support:name=ThreadBean">
  <attribute name="configService">
   <inject bean="jboss.support:name=ConfigBean"/>
  </attribute>
 </mbean>
</server>

MBean の例を記述した後、クラスと jboss-service.xml 記述子をサービスアーカイブ (.sar) の META-INF/ フォルダーでパッケージ化できます。