ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMX による管理の容易なアプリケーションの開発
11g リリース 1 (10.3.1)
B55538-01
  ドキュメントのライブラリ

目次
目次

戻る
戻る
 
次へ
次へ
 

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://java.sun.com/javase/6/docs/api/javax/management/MBeanServerConnection.html にある J2SE 6.0 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://java.sun.com/javase/6/docs/api/javax/management/StandardMBean.html にある J2SE 6.0 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 Fusion Middleware 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 Fusion Middleware Oracle Weblogic Server JMX によるカスタム管理ユーティリティの開発』の「ドメイン実行時 MBean サーバへのローカル接続の作成」を参照してください。

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

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

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

    アプリケーションがデプロイされるときに、WebLogic デプロイメント サービスは登録されているすべてのリスナに対して ApplicationLifecycleEvent 通知を送信します。リスナは、postStart 通知を受信するとその postStart メソッドを呼び出します。『Oracle Fusion Middleware 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 クラスをパッケージ化します。「その他の設計の考慮事項」を参照してください。