3 カスタムMBeanのインストゥルメントと登録
この章の内容は次のとおりです。
MBean開発プロセスの概要
図3-1に、MBean開発プロセスを示します。プロセスのステップ、および各ステップの結果については、表3-1を参照してください。以下の節では、各ステップについて詳しく説明します。
表3-1 モデルMBeanの開発タスクと結果
| ステップ | 説明 | 結果 |
|---|---|---|
|
JMXクライアントに公開するプロパティ(管理属性)と操作を記述する標準Javaインタフェースを作成します。 インタフェースを実装するJavaクラスを作成します。管理ロジックはビジネス・ロジックから分離する必要があるため、実装はビジネス・メソッドを持つクラスに配置しないでください。 |
管理インタフェースを記述および実装するソース・ファイル。 |
|
|
ビジネス・メソッドが呼び出された回数に関するデータが管理属性に含まれている場合、または、管理属性にビジネス・プロパティと同じ値を格納する場合、ビジネス・メソッドが管理実装クラスにデータをプッシュ(更新)するように修正します。 たとえば、ビジネス・クラスがデータベースに書き込む頻度を追跡する場合、データベースの書込みを処理するビジネス・メソッドが同時に管理実装クラスのカウンタ・プロパティをインクリメントするように修正します。この設計パターンを使用すると、ビジネス・コードに挿入する管理コードを最小限に抑えることができます。 |
ビジネス・ロジックと管理ロジックの明確な分離。 |
|
|
3. MBeanの登録 |
MBeanをアプリケーション・デプロイメントの一部としてインスタンス化する場合、WebLogic Server |
Javaクラスと |
|
コンパイル済みのクラスを1つのアーカイブにパッケージ化します。 |
JAR、WAR、EARファイルまたはデプロイ可能なアーカイブ・ファイル。 |
管理インタフェースの作成と実装
標準MBean設計パターンの主要なメリットの1つは、管理プロパティ(属性)の定義と実装をJavaプロパティの場合と同じ方法で( getxxx、setxxx、およびisxxxメソッドを使用して)行うことです。同様に、管理メソッド(操作)の定義と実装もJavaメソッドの場合と同じように行います。
MBeanを登録した場合、MBeanサーバーはMBeanインタフェースを調べて、データをJMXクライアントに提示する方法を決定します。次に、JMXクライアントはMBeanServerConnection.getAttribute()およびsetAttribute()メソッドを使用してMBeanの値を取得および設定し、MBeanServerConnection.invoke()を使用してその操作を呼び出します。Java SE 8 API仕様のMBeanServerConnection (http://docs.oracle.com/javase/8/docs/api/javax/management/MBeanServerConnection.html)を参照してください。
標準MBeanのインタフェースを作成するには:
-
インタフェースをパブリックとして宣言します。
-
インタフェースには次の名前を付けることをお薦めします。
Business-objectMBean.javaBusiness-objectは管理対象のオブジェクトです。標準MBeanの推奨設計パターンを使用すると、どのような命名規則にも従うことができます。それ以外の標準MBean設計パターン(MBeanの実装ファイルが
javax.management.StandardMBeanの拡張ではないパターン)では、ファイル名はImpl-fileMBean.javaというパターンに従う必要があります(Impl-fileはMBeanの実装ファイルの名前です)。 -
MBeanで提供する読み書き属性ごとに、次の命名パターンに従ってゲッターおよびセッター・メソッドを定義します。
getAttribute-namesetAttribute-nameAttribute-nameは、JMXクライアントに公開する名前です(大文字と小文字は区別されます)。各自のコーディング規約により、
Boolean型の属性のゲッター・メソッドとしてisAttribute-nameを使用することもできます。しかし、JMXクライアントは属性のデータ型に関係なくMBeanServerConnection.getAttribute()メソッドでその値を取得します。MBeanServerConnection.isAttribute()というメソッドは存在しません。 -
提供する読取り専用属性ごとに、
isまたはgetterメソッドのみを定義します。書込み専用属性ごとに、セッター・メソッドを定義します。
-
JMXクライアントに公開する各管理操作を定義します。
例3-1は、int型の読取り専用属性と、JMXクライアントがその属性値を0に設定するために使用する操作を定義するMBeanインタフェースです。
例3-1 管理インタフェース
package com.bea.medrec.controller;
public interface RecordSessionEJBMBean {
public int getTotalRx();
public void resetTotalRx();
}
このインタフェースを実装するには:
例3-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;
}
}ビジネス・メソッドの修正によるデータのプッシュ
ビジネス・メソッドが呼び出された回数に関するデータが管理属性に含まれている場合、または、管理属性にビジネス・プロパティと同じ値を格納する場合、ビジネス・メソッドが管理実装クラスにデータをプッシュ(更新)するように修正します。
例3-3に、メソッドの呼出しごとにTotalRxプロパティの整数値を増分するEJBのメソッドを示します。
例3-3 管理属性を増分するEJBメソッド
private Collection addRxs(Collection rXs, RecordLocal recordLocal)
throws CreateException, Exception {
...
com.bea.medrec.controller.RecordSessionEJBMBeanImpl.incrementTotalRx();
...
}MBeanの登録
MBeanをアプリケーション・デプロイメントの一部としてインスタンス化する場合は、アプリケーションのデプロイ時にMBeanを登録するApplicationLifecycleListenerを作成します(「ApplicationLifecycleListenerを使用したアプリケーションMBeanの登録」を参照)。
-
weblogic.application.ApplicationLifecycleListenerの拡張クラスを作成します。 -
この
ApplicationLifecycleListenerクラスに、ApplicationLifecycleListener.postStart(ApplicationLifecycleEvent evt)メソッドを実装します。このメソッドの実装で以下を行います。
-
MBeanのオブジェクト名を定義します。
以下の命名規則を使用することをお薦めします。
your.company:Name=Parent-module,Type=MBean-interface-classname
親モジュールの名前を取得するために、
ApplicationLifecycleEventを使用してApplicationContextオブジェクトを取得します。次に、ApplicationContextを使用してモジュールのIDを取得します。 -
MBeanがWebLogic Server実行時MBeanサーバーに登録する場合は、次の操作を行います。
JNDIを介してWebLogic Server実行時MBeanサーバーにアクセスします。
JMXクライアントのクラスがEJBやWebアプリケーションなどのJava EEモジュールの一部である場合、実行時MBeanサーバーのJNDI名は次のようになります。
java:comp/weblogic/jmx/runtime
たとえば:
InitialContext ctx = new InitialContext(); MBeanServer server = (MBeanServer) ctx.lookup("java:comp/weblogic/jmx/runtime");JMXクライアントのクラスがJava EEモジュールの一部ではない場合、実行時MBeanサーバーのJNDI名は次のようになります。
java:comp/jmx/runtime
Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発の実行時MBeanサーバーへのローカル接続を参照してください。
-
MBeanが ドメイン実行時MBeanサーバーに登録されている場合は、次の操作を行います。
JNDIを介して ドメイン 実行時MBeanサーバーにアクセスします。
JMXクライアントのクラスがEJBやWebアプリケーションなどのJava EEモジュールの一部である場合、ドメイン実行時MBeanサーバーのJNDI名は次のようになります。
java:comp/weblogic/jmx/domainRuntime
たとえば:
Initial context ctx = new InitialContext(); server = (MBeanServer)ctx.lookup("java:comp/weblogic/jmx/domainRuntime");JMXクライアントのクラスがJava EEモジュールの一部ではない場合、ドメイン実行時MBeanサーバーのJNDI名は次のようになります。
java:comp/jmx/domainRuntime
ノート:
ドメイン実行時MBeanサーバーは管理サーバーにのみ存在します。
ctx.lookup()コールは、 ローカルMBeanサーバーに参照を返すので、lookupメソッドは管理サーバーで実行する場合にのみ呼び出します。管理対象サーバー上で実行するときに呼び出された場合、NameNotFound例外がスローされます。Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発のドメインの実行時MBeanサーバーへのローカル接続を参照してください。
-
MBeanServer.registerMBean(Objectobject,ObjectNamename)を使用してMBeanを登録します。ここで、objectはMBean実装クラスのインスタンスです。nameはMBeanのJMXオブジェクト名です。
アプリケーションがデプロイされるときに、WebLogicデプロイメント・サービスは登録されているすべてのリスナーに対して
ApplicationLifecycleEvent通知を送信します。リスナーは、postStart通知を受信するとそのpostStartメソッドを呼び出します。Oracle WebLogic Serverアプリケーションの開発のアプリケーション・ライフサイクル・イベントのプログラミングを参照してください。 -
-
同じクラスに、
ApplicationLifecycleListener.preStop(ApplicationLifecycleEvent evt)メソッドを実装します。このメソッドの実装で、次のメソッドを呼び出してMBeanの登録を解除します。
javax.management.MBeanServer.unregister(ObjectNameMBean-name) -
次の要素をアプリケーションの
weblogic-application.xmlファイルに追加することによって、クラスをApplicationLifecycleListenerとして登録します。<listener> <listener-class> fully-qualified-class-name </listener-class> </listener>
アプリケーションとMBeanクラスのパッケージ化
MBeanへのアクセスをどのように実現するかに応じて、アプリケーションのAPP-INFディレクトリか、モジュールのJAR、WAR、または他のタイプのアーカイブ・ファイルにMBeanクラスをパッケージ化します。「その他の設計の考慮事項」を参照してください
