WebLogic JMX Service プログラマーズ ガイド
|
|
コンフィグレーション情報と実行時情報の変更をレポートするために、すべての WebLogic Server MBean は JMX 通知を送信します。通知は、基になるリソースで発生した状態の変更または他の特定の状態を説明する JMX オブジェクトです。
これらの通知をリスンするには、リスナという Java クラスを作成できます。たとえば、アプリケーションのデプロイ、アンデプロイ、再デプロイ時に通知を受信するリスナをアプリケーションに組み込むことができます。
すべての WebLogic Server MBean は、javax.management.NotificationBroadcaster インタフェースを実装します。このインタフェースにより、発生したイベントのタイプに応じてさまざまなタイプの通知オブジェクトを送信できます。たとえば、MBean はその属性の値が変更されたときに通知を送信します。
そのような通知をリスンするには、javax.management.NotificationListener を実装するリスナ クラスを作成します。
デフォルトでは、リスナは MBean から送信されるすべての通知を受信します。ただし、たいていの場合は特定の通知のみを受信する方が適切です。たとえば、LogBroadCasterRuntime MBean は WebLogic Server インスタンスからログ メッセージが生成されるたびに通知を送信します。通常は、特定の重大度のメッセージなどの特定のログ メッセージのみリスンします。通知フィルタを作成すると、リスナが受信する通知を制限できます。
リスナとフィルタ (任意) を作成したら、そのクラスを通知を受信する MBean に登録します。
図 6-1 に、NotificationListener が MBean からブロードキャストされる通知の一部のみを受信する基本的なシステムを示します。
JMX 通知とその機能の詳細を参照するには、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html から JMX 1.0 仕様をダウンロードします。
WebLogic Server には、モニタ MBean があります。モニタ MBean は、MBean を定期的に観察し、特定の MBean 属性が特定のしきい値を超えて変更された場合にのみ JMX 通知を送信するようにコンフィグレーションできます。モニタ MBean では、MBean の属性の値そのもの、または数値属性の 2 つの連続する値の差異 (オプション) を観察できます。モニタ MBean が観察する値は、派生ゲージと呼びます。
派生ゲージが一連の条件を満たす場合、モニタ MBean は特定の通知タイプを送信します。また、属性値のモニタ中に一定のエラー状態が発生した場合にも通知を送信できます。
モニタ MBean を使用するには、モニタをコンフィグレーションして WebLogic Server MBean に登録します。次に、リスナ クラスを作成して、そのクラスをモニタ MBean に登録します。モニタ MBean は非常に特殊な種類の通知のみを送信するので、通常、モニタ MBean からの通知をリスンする際にはフィルタは使用しません。
図 6-2 は、モニタ MBean が WebLogic Server MBean に登録される基本的なシステムを示しています。NotificationListener がモニタ MBean に登録され、モニタ MBean 内の条件が満たされた場合に通知を受信します。
WebLogic Server では、MBean 内の変更について 2 通りの方法で通知を受けることができます。リスナを作成してそれを直接 MBean に登録するか (図 6-1 を参照)、または MBean を定期的に観察して属性値が指定の基準を満たしたときに通知を送信するモニタ MBean をコンフィグレーションすることができます (図 6-2 を参照)。どの方法を選ぶかは、主に通知を受信する状況の複雑さによって決まります。
要件が単純な場合は、リスナを MBean に直接登録する方が適切です。NotificationListener インタフェースおよび NotificationFilter インタフェース (リスナおよびフィルタで実装するクラス) には、値をしきい値などと比較するための機能がほとんどありません。通知のデータを評価し、その結果に応じて応答する独自のコードを作成する必要があります。ただし、リスナを直接 MBean に登録すると、MBean から通知がリスナに送信され、変更が直ちに通知されるというメリットがあります。
通知要件が複雑な場合、たとえば MBean 属性の値の単一の変更とは直接関係のない一連の変更をモニタする場合などには、モニタ MBean を使用します。モニタ MBean は、データを比較して、非常に特殊な状況でのみ通知を送信するためのツールを提供します。ただし、モニタは観察対象 MBean で属性値の変更を定期的にポーリングし、変更の通知は指定したポーリング期間でしか受けられません。
表 6-1 の属性は、WebLogic Server のパフォーマンスの概要を提供します。リスナを作成して属性が含まれる MBean に直接登録するか、モニタ MBean をコンフィグレーションすることで、これらの属性をモニタできます。
リスナを作成して登録するか、モニタ MBean をコンフィグレーションするには、モニタする属性が含まれる MBean の WebLogicObjectName を指定する必要があります。「通知リスナとフィルタの登録」および「モニタとリスナのインスタンス化」を参照してください。
表 6-1 の情報を使用して、各 MBean の WebLogicObjectName を作成します。表では、domain は WebLogic Server ドメインの名前を表し、server はモニタする MBean をホストする WebLogic Server インスタンスの名前を表します。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WebLogic Server MBean から直接送信される通知をリスンするには、次の手順に従います。
すべての WebLogic Server MBean は、javax.management.NotificationBroadcaster インタフェースを実装します。このインタフェースにより、発生したイベントのタイプに応じてさまざまなタイプの通知オブジェクトを送信できます。
javax.management.AttributeChangeNotification オブジェクトが送信される。LogBroadcasterRuntimeMBean から weblogic.management.WebLogicLogNotification タイプの通知が送信される。WebLogicLogNotification の詳細については、「WebLogic Server の Javadoc」を参照してください。javax.management.MBeanServerNotification タイプの通知が送信される。addAttributeName メソッドを呼び出して配列に要素を追加すると、MBean が weblogic.management.AttributeAddNotification オブジェクトを送信する。addAttributeName メソッドをエクスポーズする MBean の例としては、weblogic.management.configuration.XMLRegistryMBean があります。詳細については、「WebLogic Server の Javadoc」を参照してください。removeAttributeName メソッドを呼び出して配列から要素を削除すると、MBean から weblogic.management.AttributeRemoveNotification オブジェクトが送信される。javax.management 通知タイプの詳細については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
weblogic.management 通知タイプの詳細については、「AttributeAddNotification」および「AttributeRemoveNotification」の Javadoc を参照してください。
javax.management.NotificationListener を実装する。 weblogic.management.RemoteNotificationListener を実装する。 NotificationListener.handleNotification(Notification notification, java.lang.Object handback) メソッドを追加する。RemoteNotificationListener.handleNotification(Notification notification, java.lang.Object handback) メソッドを追加する。注意 : このメソッドの実装は、通知ブロードキャスタをブロックするのを避けるためにできるだけ早く復帰する必要があります。
handleNotification メソッドの中で、通知オブジェクトの javax.management.Notification メソッドを呼び出します。たとえば、通知と関連付けられたタイム スタンプを取得するには、notification.getTimeStamp() を呼び出します。
通知タイプはすべて javax.management.Notification の拡張なので、すべての通知で次の Notification メソッドを利用できます。
Notification メソッドの詳細については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントで、javax.management.Notification の Javadoc を参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
NotificationListener クラスの作成時には、上記の手順だけでなく以下の事項も考慮してください。
MBean から送信されるすべての通知に 1 つのリスナを使用するのではなく、フィルタとリスナを組み合わせて使用するのがベストです。複数のリスナを使用すると JVM の初期化に時間がかかりますが、その代わりにコードの保守が楽になります。
たとえば、WebLogic Server ドメインに 3 つの JDBC 接続プールがある場合は、AttributeChangeNotifications をリスンする 1 つのリスナ クラスを作成できます。次に、3 つの登録クラスを作成します。各登録クラスは、リスナを JDBCConnectionPoolRuntime MBean の特定のインスタンスに登録します。
handleNotification メソッドのシグネチャには handback オブジェクトの引数が含まれているが、リスナでは handback オブジェクトからデータを取得したり、handback オブジェクトを操作したりする必要はない。handback オブジェクトは、リスナが MBean エミッタに関する情報を関連付けるのを助けるマイナーなオブジェクトです。次の例では、リモート リスナを作成します。AttributeChangeNotification オブジェクトを受信すると、リスナは AttributeChangeNotification のメソッドを使用して値の変更された属性の名前と古い値および新しい値を取得します。
import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import weblogic.management.RemoteNotificationListener;
import javax.management.AttributeChangeNotification;
public class MyListener implements RemoteNotificationListener {
public void handleNotification(Notification notification, Object obj) {
if(notification instanceof AttributeChangeNotification) {
AttributeChangeNotification attributeChange =
(AttributeChangeNotification) notification;
System.out.println("This notification is an
AttributeChangeNotification");
System.out.println("Observed Attribute: " +
attributeChange.getAttributeName() );
System.out.println("Old Value: " + attributeChange.getOldValue() );
System.out.println("New Value: " + attributeChange.getNewValue() );
}
}
}
必要に応じて、javax.management.NotificationFilterSupport クラスをインポートします。このクラスは、通知をフィルタ処理するためのユーティリティ メソッドを提供します。これらのメソッドの使用方法については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
フィルタは、リモート通知リスナで使用される場合のみシリアライズ可能である必要があります。RMI と共に使用されるクラスは、リモート JVM で分解および再構築できるようにシリアライズ可能である必要があります。
コード リスト 6-2 に、AttributeChangeNotification タイプの通知のみを転送するサンプル NotificationFilter を示します。
import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.AttributeChangeNotification;
public class MyHiCountFilter implements NotificationFilter,
java.io.Serializable {
public boolean isNotificationEnabled(Notification notification) {
if (!(notification instanceof AttributeChangeNotification)) {
return false;
}
AttributeChangeNotification acn =
(AttributeChangeNotification)notification;
acn.getAttributeName().equals("ActiveConnectionsHighCount"); {
return true;
}
}
}
リモート JVM で動作するリスナのフィルタを作成する場合は、通知をリスンしているサーバ インスタンスのクラスパスにフィルタのクラスを追加できます。リスナはリモート JVM で動作していますが、サーバのクラスパスにフィルタのクラスを追加すると、フィルタとリスナの間で転送されるシリアライズされたデータの量が最小限に抑えられます(図 6-3 を参照)。
図 6-3 WebLogic Server で動作するフィルタ
通知リスナ クラスとフィルタ (オプション) を実装した後は、リスナとフィルタを MBean インスタンスに登録するクラスを作成します。モニタする MBean インスタンスごとに、登録クラスを 1 つ作成する必要があります。
リスナとフィルタを管理 MBean に登録する場合は、管理サーバ上のみにある管理 MBeanHome を取得する必要があります。ローカル コンフィグレーション MBean または実行時 MBean に登録する場合は、その MBean をホストするサーバ インスタンスのローカル MBeanHome を取得する必要があります。
一般的にモニタされる MBean とその WebLogicObjectName のリストについては、表 6-1 を参照してください。
WebLogicObjectName、リスナ クラス、およびフィルタ クラスを MBeanServer インタフェースの addNotificationListener() メソッドに渡してリスナとフィルタを登録します。図 6-1 ではリスナとフィルタを直接 MBean に登録していますが (MBean の addNotificationListener() メソッドを呼び出して登録)、実際には、MBeanServer インタフェースの addNotificationListener() メソッドを使用する方がより適切です。そうすることで、登録作業だけのために特定の MBean をルックアップする手間を省けます。
次の例は、リモート JVM で動作する登録クラスです。クラスが WebLogic Server インスタンスと同じ JVM で動作する場合、MBeanHome インタフェースを取得するためのコードはさらに単純なものになります。詳細については、「MBeanHome インタフェースへのアクセス」を参照してください。
このクラス例は、コード リスト 6-1 のリスナと コード リスト 6-2 のフィルタを Server1 というサーバ インスタンスの Server 管理 MBean に登録します。この例で、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。MBean の表示や変更のパーミッションの詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ロール」を参照してください。
このクラス例には、通知を受信するまでクラスをアクティブに保つコードも含まれています。リスナ クラスは、クラスの呼び出しとアクティブの維持を行う、より大きなアプリケーションのコンテキストで動作するため、このコードは通常は必要ありません。ここでは、簡単にコンパイルして例の機能を確認できるように含まれています。
import java.util.Set;
import java.util.Iterator;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.management.ObjectName;
import javax.management.Notification;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import weblogic.management.WebLogicMBean;
import weblogic.management.WebLogicObjectName;
import weblogic.management.RemoteMBeanServer;
import weblogic.management.configuration.ServerMBean;
public class listener {
public static void main(String[] args) {
MBeanHome home = null;
RemoteMBeanServer rmbs = null;
//ドメイン変数
String url = "t3://localhost:7001";
String serverName = "Server1";
String username = "weblogic";
String password = "weblogic";
//MBeanHome を使用して MBeanServer を取得
try {
Environment env = new Environment();
env.setProviderUrl(url);
env.setSecurityPrincipal(username);
env.setSecurityCredentials(password);
Context ctx = env.getInitialContext();
//管理 MBeanHome インタフェースを取得
home = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
System.out.println("Got the Admin MBeanHome: " + home );
rmbs = home.getMBeanServer();
} catch (Exception e) {
System.out.println("Caught exception: " + e);
}
try {
//リスナ クラスをインスタンス化
MyListener listener = new MyListener();
MyFilter filter = new MyFilter();
//リスンする必要のある MBean の WebLogicObjectName
//を作成
WebLogicObjectName mbeanName = new WebLogicObjectName(serverName,
"Server",home.getDomainName());
System.out.println("Created WebLogicObjectName: " + mbeanName);
//MBean の名前とリスナ クラスを MBeanServer の
//addNotificationListener メソッドに渡す
rmbs.addNotificationListener(mbeanName, listener, filter, null);
System.out.println("\n[myListener]: Listener registered ...");
//リモート クライアントをアクティブに保つ
System.out.println("pausing...........");
System.in.read();
} catch(Exception e) {
System.out.println("Exception: " + e);
}
}
}
ユーザがコンフィグレーションを変更したり、ドメイン内のリソースに対する管理操作を呼び出したりする場合に、管理サーバがログ メッセージを送信するようにコンフィグレーションすることができます。たとえば、ユーザがドメインの管理対象サーバの SSL を無効化すると、管理サーバがログ メッセージを送信します。これらのメッセージは、ドメインのコンフィグレーション内における変更の監査記録を提供します (コンフィグレーション監査)。Administration Console オンライン ヘルプの「コンフィグレーション監査」を参照してください。
コンフィグレーション監査メッセージに対応する JMX のリスナおよびフィルタを作成するには、次の手順に従います。
「コンフィグレーション監査メッセージの通知リスナ」を参照してください。
「コンフィグレーション監査メッセージの通知フィルタ」を参照してください。
LogBroadcasterRuntime MBean に登録するクラスを作成してコンパイルします。これが、WebLogic Server インスタンスがログ メッセージを JMX 通知としてブロードキャストするのに使用する MBean です。「コンフィグレーション監査メッセージの登録クラス」を参照してください。
Administration Console オンライン ヘルプの「起動クラスと停止クラス」を参照してください。
コード リスト 6-1 の通知リスナ同様、コード リスト 6-4 のリスナは RemoteNotificationListener およびその handleNotification メソッドを実装します。
コンフィグレーション監査メッセージはすべて、WebLogicLogNotification タイプなので、コード リスト 6-4 のリスナは WebLogicLogNotification インタフェースをインポートし、そのメソッドを使用して各コンフィグレーション監査メッセージ内の情報を取得します。
コード リスト 6-4コンフィグレーション監査メッセージの通知リスナ
import javax.management.Notification;
import javax.management.NotificationListener;
import weblogic.management.RemoteNotificationListener;
import weblogic.management.logging.WebLogicLogNotification;
public class ConfigAuditListener implements RemoteNotificationListener {
public void handleNotification(Notification notification, Object obj) {
WebLogicLogNotification changeNotification =
(WebLogicLogNotification) notification;
System.out.println("A user has attempted to change the configuration
of a WebLogic Server domain.");
System.out.println("Admin Server Name: " +
changeNotification.getServername() );
System.out.println("Time of attempted change:" +
changeNotification.getTimeStamp() );
System.out.println("Message details:" +
changeNotification.getMessage() );
System.out.println("Message ID string:" +
changeNotification.getMessageId() );
}
}
通知フィルタがないと、コード リスト 6-4 のリスナは、管理サーバがブロードキャストするすべてのメッセージについて、サーバ名、タイムスタンプ、およびメッセージ テキストを出力します。
リソースが変更されたことを示すコンフィグレーション監査メッセージのみを転送するために、コード リスト 6-5 のフィルタでは WebLogicLogNotification.getMessageId メソッドを使用してすべての受信ログ通知のメッセージ ID を取得します。
リソース変更を示すコンフィグレーション監査メッセージは、メッセージ ID 159904 によって識別されます (Administration Console オンライン ヘルプの「コンフィグレーション監査」を参照)。受信ログ通知のメッセージ ID 値がコンフィグレーション監査メッセージの ID と一致すると、フィルタで true と評価され、そのメッセージが登録リスナに転送されます。
コード リスト 6-5コンフィグレーション監査メッセージの通知フィルタ
import javax.management.Notification;
import javax.management.NotificationFilter;
import weblogic.management.logging.WebLogicLogNotification;
public class ConfigAuditFilter implements NotificationFilter ,
java.io.Serializable{
int configChangedId =159904;
public boolean isNotificationEnabled(Notification notification) {
if (!(notification instanceof WebLogicLogNotification)) {
return false;
}
WebLogicLogNotification wln =
(WebLogicLogNotification)notification;
int messageId = wln.getMessageId();
if (configChangedId == messageId) {
return true;
} else {
return false;
}
}
}
コード リスト 6-6 のクラスは、通知リスナおよびフィルタを管理サーバの LogBroadcasterRuntime MBean に登録します。この MBean は WebLogic Server の各インスタンスのシングルトンであり、その名前は常に TheLogBroadcaster です。
コード リスト 6-6コンフィグレーション監査メッセージの登録クラス
import java.util.Set;
import java.util.Iterator;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.management.ObjectName;
import javax.management.Notification;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import weblogic.management.WebLogicMBean;
import weblogic.management.WebLogicObjectName;
import weblogic.management.RemoteMBeanServer;
import weblogic.management.configuration.ServerMBean;
public class ListenRegistration {
public static void main(String[] args) {
MBeanHome home = null;
RemoteMBeanServer rmbs = null;
//ドメイン変数
String url = "t3://localhost:7001";
String serverName = "examplesServer";
String username = "weblogic";
String password = "weblogic";
//Using MBeanHome to get MBeanServer.
try {
Environment env = new Environment();
env.setProviderUrl(url);
env.setSecurityPrincipal(username);
env.setSecurityCredentials(password);
Context ctx = env.getInitialContext();
//管理 MBeanHome を取得
home = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
System.out.println("Got the Admin MBeanHome: " + home );
rmbs = home.getMBeanServer();
} catch (Exception e) {
System.out.println("Caught exception: " + e);
}
try {
//リスナ クラスをインスタンス化
ConfigAuditListener listener = new ConfigAuditListener();
ConfigAuditFilter filter = new ConfigAuditFilter();
//リスンする必要のある MBean の WebLogicObjectName
//を作成
WebLogicObjectName mbeanName = new WebLogicObjectName(
"TheLogBroadcaster",
"LogBroadcasterRuntime",
home.getDomainName(),
serverName );
System.out.println("Created WebLogicObjectName: " + mbeanName);
//MBean の名前とリスナ クラスを MBeanServer の
//addNotificationListener メソッドに渡す
rmbs.addNotificationListener(mbeanName, listener, filter, null);
System.out.println("\n[myListener]: Listener registered ...");
//リモート クライアントをアクティブに保つ
System.out.println("pausing...........");
System.in.read();
} catch(Exception e) {
System.out.println("Exception: " + e);
}
}
}
モニタ MBean をコンフィグレーションして使用するには、次の手順に従います。
WebLogic Server は、特定のデータ型の変更を観察するモニタ MBean を提供します。MBean が返す属性値のオブジェクト タイプと一致するモニタ MBean タイプをコンフィグレーションおよびインスタンス化する必要があります。たとえば、StringMonitor タイプに基づくモニタ MBean は、実際の属性値が (instanceof 演算子で定義されているように) String インスタンスである場合に限って、Object として宣言されている属性を観察できます。
weblogic.Admin GET コマンドを使用する。このコマンドでは、指定する MBean に関する情報を取得できます。詳細については、『WebLogic Server のコンフィグレーションと管理』の「MBean 管理コマンド リファレンス」を参照してください。javap コマンドを使用する。javap コマンドは、クラス ファイルを逆アセンブルする標準 Java ユーティリティです。モニタ タイプの詳細については、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 仕様を参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
各タイプのモニタ MBean は、特定のタイプの javax.management.monitor.MonitorNotification 通知を送信します。特定の通知に対しては、MonitorNotification.getType() メソッドを使用してそのタイプを判別できます。
次の表では、モニタ MBean が送信する通知のタイプについて説明します。
|
|
|
すべてのモニタは、エラー状態を示す以下の通知タイプを送信できます。
jmx.monitor.error.mbean。この通知タイプは、観察対象 MBean が MBean サーバに登録されていないことを示します。この通知には、観察対象のオブジェクト名が示されます。jmx.monitor.error.attribute。この通知タイプは、観察対象の属性が観察対象オブジェクトに存在しないことを示します。この通知には、観察対象のオブジェクト名と属性名が示されます。jmx.monitor.error.type。この通知タイプは、観察対象の属性値のオブジェクト インスタンスが null か、またはモニタに対応していないタイプであることを示します。この通知には、観察対象のオブジェクト名と属性名が示されます。jmx.monitor.error.runtime。この通知タイプには、観察対象の属性値の取得中に (上記以外の理由で) 送出された例外が含まれます。また、カウンタとゲージ モニタも、以下の状態のときに jmx.monitor.error.threshold 通知タイプを送信できます。
モニタ MBean は、他の MBean と同じように javax.management.NotificationBroadcaster を実装して通知を送信します。モニタ MBean からの通知のリスナを作成するには、次のようなクラスを作成します。
同じ通知リスナを LogBroadcasterMBean のインスタンス、モニタ MBean、または他の MBean に登録できます。
次の例では、WebLogic Server JVM の外部の JVM で実行されるアプリケーション用のリスナ オブジェクトを作成します。この例には、モニタ MBean から通知を受信したときに追加のメッセージを出力するロジックが含まれています。このロジックはさらに改良して、「モニタの通知タイプ」で説明されている異なるタイプのモニタ通知に対してリスナが異なる方法で応答するようにすることもできます。
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
import weblogic.management.RemoteNotificationListener;
public class CounterListener implements RemoteNotificationListener {
public void handleNotification(Notification notification ,Object obj) {
System.out.println("\n\n Notification Received ...");
System.out.println("Type=" + notification.getType() );
System.out.println("Message=" + notification.getMessage() );
System.out.println("SequenceNumber=" +
notification.getSequenceNumber());
System.out.println("Source=" + notification.getSource());
System.out.println("Timestamp=" + notification.getTimeStamp() + "\n" );
if(notification instanceof MonitorNotification) {
MonitorNotification monitorNotification =
MonitorNotification)notification;
System.out.println("This notification is a MonitorNotification");
System.out.println("Observed Attribute: " +
monitorNotification.getObservedAttribute() );
System.out.println("Observed Object: " +
monitorNotification.getObservedObject() );
System.out.println("Trigger value: " +
monitorNotification.getTrigger() );
}
}
}
モニタ MBean を観察対象 MBean に登録するための手順は、単一のサーバ インスタンスにあるモニタ MBean、またはドメイン内の複数のサーバ インスタンスにあるモニタ MBean のどちらを登録するかによって異なります。
注意 : WebLogic Server には、モニタ MBean に対する型保証スタブが用意されていないため、標準の JMX 設計パターンを使用する必要があります。標準の JMX 設計パターンでは、JMX クライアントで MBeanServer インタフェースを使用して、モニタ MBean の属性の取得と設定、およびオペレーションの呼び出しを行います。
次の例では、ExecuteQueueRuntimeMBean の ServicedRequestTotalCount 属性用のカウンタ モニタを作成します。この属性は、対応する実行キューによって処理された要求の数を返します。WebLogic Server は実行キューを使用して、重要なアプリケーションのパフォーマンスを最適化します。詳細については、「実行キューによるスレッド使用の制御」を参照してください。
単一のサーバ インスタンスにあるExecuteQueueRuntimeMBean のカウンタ モニタを作成するために、コード リスト 6-8 のサンプル クラスは次のように機能します。
「MBeanServer インタフェースを使用した MBean へのアクセス」を参照してください。
オブジェクト名は WebLogic Server ドメイン全体に渡ってユニークで、かつ、次の JMX 命名規約に従う必要があります。
domain name:Name=name,Type=type[,attr=value]...
http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な javax.management.ObjectName の Javadoc を参照してください。
MBeanServer.createMBean メソッドで、WebLogic Server JVM における MBean オブジェクトの作成と、そのサーバの MBean サーバ内へのそのオブジェクトの登録を行います。
一般的にモニタされる MBean とその WebLogicObjectName のリストについては、表 6-1 を参照してください。
モニタのコンフィグレーションに使用する属性とオペレーションについては、以下を参照してください。
CounterMonitor オブジェクトのコンフィグレーション
GaugeMonitor オブジェクトのコンフィグレーション
この例で、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。MBean の表示や変更のパーミッションの詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ロール」を参照してください。
コード リスト 6-8単一のサーバにあるカウンタ モニタとリスナをインスタンス化する
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.monitor.CounterMonitor;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
public class ClientMonitor {
// WebLogic ドメインの名前。この名前を変更して、インストールされているシステムの
// 特定のドメイン名に一致させる
private static String weblogicDomain = "mydomain";
// WebLogic server の名前と URL。これらを変更して、インストールされているシステムの
// 特定のサーバ名と URL に一致させる
private static String weblogicServer = "myserver";
private static String url = "t3://localhost:7001";
// 管理者ロールのユーザの一連の資格。これらを変更して、
// 使用しているセキュリティ レルムの管理者名に一致させる
private static String username = "weblogic";
private static String password = "weblogic";
public static void main(String Args[]) {
try {
// MBeanServer インタフェースを取得する。これは、
// クライアント サイドからモニタを作成/登録する場合に必要
MBeanServer rmbs = null;
Hashtable props = new Hashtable();
props.put(Context.PROVIDER_URL, url);
props.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
props.put(Context.SECURITY_PRINCIPAL, username);
props.put(Context.SECURITY_CREDENTIALS, password);
InitialContext ctx = new InitialContext(props);
rmbs = (MBeanServer) ctx.lookup("weblogic.management.server");
// CounterMonitor オブジェクトの objectName を作成する
ObjectName monitorObjectName = new ObjectName(
"mcompany:Name=MyCounter,Type=CounterMonitor");
// モニタ MBean を作成する
rmbs.createMBean(
"javax.management.monitor.CounterMonitor", monitorObjectName);
// MBean 属性を使ってモニタ オブジェクトをコンフィグレーションする
AttributeList monitorAttributes = new AttributeList();
// 観察対象 MBean の objectName を作成する
ObjectName qObjectName = new ObjectName(weblogicDomain
+ ":Name=weblogic.kernel.Default,Location=" + weblogicServer
+ ",Type=ExecuteQueueRuntime,ServerRuntime=" + weblogicServer);
Attribute observedObjectAttribute = new Attribute("ObservedObject",
qObjectName);
monitorAttributes.add(observedObjectAttribute);
Attribute observedAttributeAttribute =
new Attribute("ObservedAttribute", "ServicedRequestTotalCount");
monitorAttributes.add(observedAttributeAttribute);
Attribute notifyAttribute = new Attribute("Notify", new Boolean(true));
monitorAttributes.add(notifyAttribute);
// CounterMonitor オブジェクトをコンフィグレーションするときに使用する、
// 一連の変数を定義する
Integer threshold = new Integer(10);
Integer offset = new Integer(1);
Attribute thresholdAttribute = new Attribute("Threshold", threshold);
monitorAttributes.add(thresholdAttribute);
Attribute offsetAttribute = new Attribute("Offset", offset);
monitorAttributes.add(offsetAttribute);
monitorAttributes = rmbs.setAttributes(monitorObjectName,
monitorAttributes);
// 使用するリスナをインスタンス化してモニタに登録する
CounterListener listener = new CounterListener();
rmbs.addNotificationListener(monitorObjectName, listener, null, null);
// モニタを起動する
Object[] params = new Object[0];
String[] signature = new String[0];
rmbs.invoke(monitorObjectName, "start", params, signature);
// クライアントのプログラムから抜け出ることを回避する
synchronized (listener) {
try {
listener.wait();
} catch (InterruptedException ignore) {
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
WebLogic Server ドメインはサーバ インスタンスごとに MBean のセットを保持します。たとえば、各サーバ インスタンスは自身の ServerRuntimeMBean、LogMBean、および ExecuteQueueRuntimeMBean をホストします。管理サーバに接続すると、その接続だけでこれらすべての MBean インスタンスにアクセスできるので便利です。この 1 つの接続で、ドメイン内のあらゆるサーバ上の MBean に対してモニタ MBean を作成することもできます。たとえば、使用している JMX クライアントから管理サーバに接続し、各管理対象サーバにカウンタ モニタ MBean を作成して、サーバの ExecuteQueueRuntimeMBean をモニタする、といったことが可能です。
この方法を使用する JMX クライアントには、weblogic.management.MBeanHome および weblogic.management.runtime.ServerRuntimeMBean クラスをインポートする必要があります。
ドメイン内の各サーバ インスタンスにある ExecuteQueueRuntimeMBean のインスタンスをモニタするために、コード リスト 6-9 の抜粋コードは次のように機能します。
管理 MBeanHome インタフェースを使用すると、クライアントから、ドメイン内のすべてのアクティブなサーバ インスタンスにアクセスできます。また、その際に、各サーバ インスタンスのリスン アドレスやリスン ポートを判別したり、サーバ インスタンスが現在アクティブかどうかを判断したりする必要がありません。
このコードでローカル サーバの MBeanServer インタフェースを取得した後には、コード リスト 6-8 に示したモニタ MBean の作成処理に進めます。
コード リスト 6-9 複数のサーバ インスタンス上でのモニタのインスタンス化
import weblogic.management.MBeanHome;
import weblogic.management.runtime.ServerRuntimeMBean;
...
// 管理ホームを取得する
MBeanHome adminhome = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
// 実行中の管理対象サーバのリストを取得して、そのリストを反復処理する
Set srSet = adminhome.getMBeansByType("ServerRuntime");
Iterator sr_iter = srSet.iterator();
while (sr_iter.hasNext()) {
ServerRuntimeMBean bean = (ServerRuntimeMBean) sr_iter.next();
// Get the local home for the managed server
MBeanHome localhome =
(MBeanHome) ctx.lookup(MBeanHome.JNDI_NAME + "."+ bean.getName());
// 管理対象サーバの MBeanServer を取得する
MBeanServer rmbs = localhome.getMBeanServer();
...// モニタ MBean を作成するコード
}
CounterMonitor オブジェクトは、整数で表される MBean 属性の変更を観察します。次に、CounterMonitor インスタンスの一般的なコンフィグレーションを行うために設定する一連の CounterMonitor 属性を示します。
Threshold を 1000 に、Offset を 2000 に設定した場合、観察対象の属性が 1000 を超えると、CounterMonitor オブジェクトは通知を送信して、しきい値を 3000 に増やします。観察対象の属性が 3000 を超えると、CounterMonitor オブジェクトは通知を送信して、しきい値を再び 5000 に増やします。Modulus 属性に指定された値に達すると、オフセット値が適用される前に、モニタの Threshold 属性に対する最近のセッターの呼び出しで指定された値に戻ります。たとえば、初めの Threshold を 1000 に、Modulus を 5000 に設定した場合、Threshold が 5000 を超えると、モニタにより通知が送信され、Threshold が 1000 にリセットされます。Threshold が 20 で、モニタにより属性値 2 が観察されたとします。この場合、次の観察値が 22 より大きいと、モニタから通知が送信されます。しかし、次の観察時に値が 10 で、その次の観察時には 25 であった場合、連続する 2 つの観察値の変化はいずれも 20 以下なので、モニタから通知は送信されません。Modulus 属性に指定された値に達すると、オフセット値が適用される前に、モニタの Threshold 属性に対する最近のセッターの呼び出しで指定された値に戻ります。 CounterMonitor インスタンスで可能なすべてのコンフィグレーションについては、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
GaugeMonitor オブジェクトは、整数または浮動小数点で表される MBean 属性の変更を観察します。次に、GaugeMonitor インスタンスの一般的なコンフィグレーションを行うために使用する一連の GaugeMonitor の属性およびオペレーションを示します。
GaugeMonitor ではオフセットや係数はサポートされません。
GaugeMonitor インスタンスで可能なすべてのコンフィグレーションについては、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
StringMonitor オブジェクトは、文字列で表される MBean 属性の変更を観察します。次に、StringMonitor インスタンスの一般的なコンフィグレーションを行うために設定する一連の StringMonitor の属性を示します。
StringToCompare に指定されている文字列と一致するときに通知を送信するStringToCompare に指定されている文字列と異なるときに通知を送信するStringMonitor インスタンスで可能なすべてのコンフィグレーションについては、http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html からダウンロード可能な JMX 1.0 API のドキュメントを参照してください。ダウンロードしたアーカイブに、API ドキュメントが格納されています。
|
|
|