ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMXによる管理の容易なアプリケーションの開発
12c リリース1 (12.1.1)
B65909-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

4 カスタムMBeanのインストゥルメントと登録

この章では、アプリケーション・モジュール用の標準MBeanをインストゥルメントおよび登録する方法について説明します。

この章の内容は以下のとおりです。

MBean開発プロセスの概要

図4-1に、MBean開発プロセスを示します。プロセスの手順、および各手順の結果については、「表4-1」を参照してください。以下の節では、各手順について詳しく説明します。

図4-1 標準MBean開発の概要

図4-1の説明が続きます
「図4-1 標準MBean開発の概要」の説明

表4-1 モデルMBeanの開発タスクと結果

手順 説明 結果

1. 管理インタフェースの作成と実装

JMXクライアントに公開するプロパティ(管理属性)と操作を記述する標準Javaインタフェースを作成します。

インタフェースを実装するJavaクラスを作成します。管理ロジックはビジネス・ロジックから分離する必要があるため、実装はビジネス・メソッドを持つクラスに配置しないでください。

管理インタフェースを記述および実装するソース・ファイル。

2. ビジネス・メソッドの修正によるデータのプッシュ

ビジネス・メソッドが呼び出された回数に関するデータが管理属性に含まれている場合、または、管理属性にビジネス・プロパティと同じ値を格納する場合、ビジネス・メソッドが管理実装クラスにデータをプッシュ(更新)するように修正します。

たとえば、ビジネス・クラスがデータベースに書き込む頻度を追跡する場合、データベースの書込みを処理するビジネス・メソッドが同時に管理実装クラスのカウンタ・プロパティをインクリメントするように修正します。この設計パターンを使用すると、ビジネス・コードに挿入する管理コードを最小限に抑えることができます。

ビジネス・ロジックと管理ロジックの明確な分離。

3. MBeanの登録

MBeanをアプリケーション・デプロイメントの一部としてインスタンス化する場合、WebLogic Server ApplicationLifecycleListenerクラスを作成し、MBeanを登録します。

Javaクラスとweblogic-application.xmlの追加エントリ。

4. アプリケーションとMBeanクラスのパッケージ化

コンパイル済みのクラスを1つのアーカイブにパッケージ化します。

JAR、WAR、EARファイルまたはデプロイ可能なアーカイブ・ファイル。


管理インタフェースの作成と実装

標準MBean設計パターンの主要なメリットの1つは、管理プロパティ(属性)の定義と実装をJavaプロパティの場合と同じ方法で( getxxxsetxxx、およびisxxxメソッドを使用して)行うことです。同様に、管理メソッド(操作)の定義と実装もJavaメソッドの場合と同じように行います。

MBeanを登録した場合、MBeanサーバーはMBeanインタフェースを調べて、データをJMXクライアントに提示する方法を決定します。次に、JMXクライアントはMBeanServerConnection.getAttribute()およびsetAttribute()メソッドを使用してMBeanの値を取得および設定し、MBeanServerConnection.invoke()を使用してその操作を呼び出します。http://download.oracle.com/javase/6/docs/api/javax/management/MBeanServerConnection.htmlにあるJava SE 6 API仕様の「MBeanServerConnection」を参照してください。

標準MBeanのインタフェースを作成するには:

  1. インタフェースをパブリックとして宣言します。

  2. インタフェースには次の名前を付けることをお薦めします。

    Business-objectMBean.java 
    

    Business-objectは管理対象のオブジェクトです。

    標準MBeanの推奨設計パターンを使用すると、どのようなネーミング・ルールにも従うことができます。それ以外の標準MBean設計パターン(MBeanの実装ファイルがjavax.management.StandardMBeanの拡張ではないパターン)では、ファイル名はImpl-fileMBean.javaというパターンに従う必要があります(Impl-fileはMBeanの実装ファイルの名前です)。

  3. MBeanで提供する読み書き属性ごとに、次の命名パターンに従ってゲッターおよびセッター・メソッドを定義します。

    getAttribute-name

    setAttribute-name

    Attribute-nameは、JMXクライアントに公開する名前です(大文字と小文字は区別されます)。

    各自のコーディング規約により、Boolean型の属性のゲッター・メソッドとしてisAttribute-nameを使用することもできます。しかし、JMXクライアントは属性のデータ型に関係なくMBeanServerConnection.getAttribute()メソッドでその値を取得します。MBeanServerConnection.isAttribute()というメソッドは存在しません。

  4. 提供する読取り専用属性ごとに、is またはgetterメソッドのみを定義します。

    書込み専用属性ごとに、セッター・メソッドを定義します。

  5. JMXクライアントに公開する各管理操作を定義します。

例4-1は、int型の読取り専用属性と、JMXクライアントがその属性値を0に設定するために使用する操作を定義するMBeanインタフェースです。

例4-1 管理インタフェース

package com.bea.medrec.controller;
public interface RecordSessionEJBMBean {
   public int getTotalRx(); 
   public void resetTotalRx(); 
}

このインタフェースを実装するには:

  1. パブリック・クラスを作成します。

    実装ファイルのネーミング・ルールとして、MBean-InterfaceImpl.javaというパターンを使用することをお薦めします。

  2. javax.management.StandardMBeanを拡張して、このパターンが命名要件を満たすようにします。

    http://download.oracle.com/javase/6/docs/api/javax/management/StandardMBean.htmlにあるJava SE 6 API仕様の「StandardMBean」を参照してください。

  3. StandardMBean(Object implementation, Class mbeanInterface)コンストラクタを実装します。

    管理ロジックを委託クラスに分離する推奨設計パターンでは、StandardMBean(Object implementation, Class mbeanInterface)コンストラクタを実装するパブリック・コンストラクタを提供する必要があります。

  4. 管理インタフェースで定義したメソッドを実装します。

    以下のガイドラインに従ってください。

    • ビジネス・オブジェクトが管理データを管理オブジェクトにプッシュする推奨設計パターンでは、ビジネス・メソッドが管理属性の値を設定するために使用するメソッドをこの実装クラスに組み込みます。例4-2では、incrementTotalRx()メソッドはビジネス・メソッドで使用できますが、管理インタフェースの一部ではありません。

    • EJB、サーブレット、またはその他のクラスの複数のインスタンスが管理属性の値を設定できる場合、プロパティが個別にインクリメントされるようにし、またそのゲッターおよびセッター・メソッド(またはインクリメント・メソッド)が同期されないようにしてください。同期化によって管理データの正確さは保証されますが、管理操作が完了するまでビジネス・スレッドがブロックされます。

例4-2 MBeanの実装

package com.bea.medrec.controller;

import javax.management.StandardMBean;
import com.bea.medrec.controller.RecordSessionEJBMBean;
public class RecordSessionEJBMBeanImpl extends StandardMBean 
   implements RecordSessionEJBMBean {

   public RecordSessionEJBMBeanImpl() throws
      javax.management.NotCompliantMBeanException {
         super(RecordSessionEJBMBean.class);
   }

   public int TotalRx = 0;
   public int getTotalRx() {
        return TotalRx;
   }
   public void incrementTotalRx() {
      TotalRx++;
   }
   public void resetTotalRx() {
       TotalRx = 0;
   }
}

ビジネス・メソッドの修正によるデータのプッシュ

ビジネス・メソッドが呼び出された回数に関するデータが管理属性に含まれている場合、または、管理属性にビジネス・プロパティと同じ値を格納する場合、ビジネス・メソッドが管理実装クラスにデータをプッシュ(更新)するように修正します。

例4-3に、メソッドの呼出しごとにTotalRxプロパティの整数値を増分するEJBのメソッドを示します。

例4-3 管理属性を増分するEJBメソッド

private Collection addRxs(Collection rXs, RecordLocal recordLocal)
   throws CreateException, Exception {
   ...
   com.bea.medrec.controller.RecordSessionEJBMBeanImpl.incrementTotalRx();
   ...
}

MBeanの登録

MBeanをアプリケーション・デプロイメントの一部としてインスタンス化する場合は、アプリケーションのデプロイ時にMBeanを登録するApplicationLifecycleListenerを作成します(「ApplicationLifecycleListenerを使用したアプリケーションMBeanの登録」を参照)。

  1. weblogic.application.ApplicationLifecycleListenerの拡張クラスを作成します。

  2. このApplicationLifecycleListenerクラスに、ApplicationLifecycleListener.postStart(ApplicationLifecycleEvent evt)メソッドを実装します。

    このメソッドの実装で以下を行います。

    1. MBeanのオブジェクト名を定義します。

      以下のネーミング・ルールを使用することをお薦めします。

      your.company:Name=Parent-module,Type=MBean-interface-classname 
      

      親モジュールの名前を取得するために、ApplicationLifecycleEventを使用してApplicationContextオブジェクトを取得します。次に、ApplicationContextを使用してモジュールのIDを取得します。

    2. MBeanがWebLogic Server実行時MBeanサーバーに登録する場合は、次の操作を行います。

      JNDIを介してWebLogic Server実行時MBeanサーバーにアクセスします。

      JMXクライアントのクラスがEJBやWebアプリケーションなどのJava EEモジュールの一部である場合、実行時MBeanサーバーのJNDI名は次のようになります。

      java:comp/env/jmx/runtime
      

      例:

      InitialContext ctx = new InitialContext();
      MBeanServer server = (MBeanServer)
           ctx.lookup("java:comp/env/jmx/runtime"); 
      

      JMXクライアントのクラスがJava EEモジュールの一部ではない場合、実行時MBeanサーバーのJNDI名は次のようになります。

      java:comp/jmx/runtime 
      

      『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の実行時MBeanサーバーへのローカル接続に関する項を参照してください。

    3. MBeanが ドメイン実行時MBeanサーバーに登録されている場合は、次の操作を行います。

      JNDIを介して ドメイン 実行時MBeanサーバーにアクセスします。

      JMXクライアントのクラスがEJBやWebアプリケーションなどのJava EEモジュールの一部である場合、ドメイン実行時MBeanサーバーのJNDI名は次のようになります。

      java:comp/env/jmx/domainRuntime
      

      例:

      Initial context ctx = new InitialContext();
      server = (MBeanServer)ctx.lookup("java:comp/env/jmx/domainRuntime");
      

      JMXクライアントのクラスがJava EEモジュールの一部ではない場合、ドメイン実行時MBeanサーバーのJNDI名は次のようになります。

      java:comp/jmx/domainRuntime
      

      注意:

      ドメイン実行時MBeanサーバーは管理サーバーにのみ存在します。ctx.lookup()コールは、 ローカルMBeanサーバーに参照を返すので、lookupメソッドは管理サーバーで実行する場合にのみ呼び出します。管理対象サーバーで実行するとき、このメソッドを呼び出すと、NameNotFound例外が送出されます。


      『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』のドメインの実行時MBeanサーバーへのローカル接続に関する項を参照してください。

    4. MBeanServer.registerMBean(Object object, ObjectName name)を使用してMBeanを登録します。ここで、

      objectはMBean実装クラスのインスタンスです。

      nameはMBeanのJMXオブジェクト名です。

    アプリケーションがデプロイされるときに、WebLogicデプロイメント・サービスは登録されているすべてのリスナーに対してApplicationLifecycleEvent通知を送信します。リスナーは、postStart通知を受信するとそのpostStartメソッドを呼び出します。『Oracle WebLogic Serverアプリケーションの開発』のアプリケーション・ライフサイクル・イベントのプログラミングに関する項を参照してください。

  3. 同じクラスに、ApplicationLifecycleListener.preStop(ApplicationLifecycleEvent evt)メソッドを実装します。

    このメソッドの実装で、次のメソッドを呼び出してMBeanの登録を解除します。javax.management.MBeanServer.unregister(ObjectName MBean-name)

  4. 次の要素をアプリケーションのweblogic-application.xmlファイルに追加することによって、クラスをApplicationLifecycleListenerとして登録します。

    <listener>
       <listener-class>
          fully-qualified-class-name
       </listener-class>
    </listener> 
    

この方法の例については、MedRecサンプル・サーバーを参照してください。

アプリケーションとMBeanクラスのパッケージ化

MBeanへのアクセスをどのように実現するかに応じて、アプリケーションのAPP-INFディレクトリか、モジュールのJAR、WAR、または他のタイプのアーカイブ・ファイルにMBeanクラスをパッケージ化します。「その他の設計の考慮事項」を参照してください。