WebOTXの運用管理エージェントにアクセスするためのJMXアプリケーションの作成方法について説明します。
JMXアプリケーションを作成するには次のAPIを利用します。
それぞれのAPIリファレンスについては[ リファレンス集 開発編(共通) ] を参照してください。
本章では、上記APIを利用してMBeanの属性を取得、設定したり、オペレーションを呼び出したり、Notification通知を受け取る手順について説明します。
WebOTXの運用管理エージェントにアクセスするためのJMXアプリケーションを動作させるための環境設定について説明します。
Java SE Development Kit 7 以上を使用してください。
「5.1.3.1. JMXRemoteClientクラスを利用する方法」で作成したソースをビルドする場合は、以下のライブラリをクラスパスに追加してください。
Java SE Development Kit 7 以上を使用してください。
「5.1.3.1. JMXRemoteClientクラスを利用する方法」で作成したクラスを実行する場合は、以下のライブラリをクラスパスに追加してください。
サーバ/クライアント間のSSL通信で利用する証明書ファイルが必要です。サーバ側の認証ファイルに格納されている情報の認証情報が格納されている必要があります。 サンプルアプリケーションにもサンプル用の証明書ファイル(cacerts.jks)がありますのでこれを利用することも可能です。
JMXアプリケーションとして次のシステムプロパティを利用します。クライアントの証明書ファイルを指定します。
JMX Remote APIを利用したクライアントを作成する場合、次のimport文を含める必要があります。
import java.util.*;
import java.security.*;
import java.io.*;
import javax.net.ssl.*;
//
// JMX API
//
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanInfo;
import javax.management.Attribute;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.AttributeList;
//
// JMX Remote API
//
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
運用管理エージェントに接続するためにJMXConnectorオブジェクトを作成します。
JMXConnectorオブジェクトを作成するには、WebOTXが提供するJMXRemoteClientクラスを利用する方法と、標準のJMX Remote API利用してプロファイル情報を個別に設定する方法があります。
//
// WebOTX API
//
import com.nec.webotx.enterprise.admin.jmx.remote.client.*;
import com.nec.webotx.enterprise.admin.jmx.remote.plainclient.*;
// URLの生成
// プロトコル RMI
// ホスト名 localhost
// 管理ポート番号 6212
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://host:6212/management/rmi-jmx-connector");
// JMXRemoteClientの生成
final JMXRemoteClient jmxcl = new JMXRemoteClient();
jmxcl.config(System.getProperty("javax.net.ssl.trustStore"), "changeit", false);
// JMXConnectorの生成
final JMXConnector jmxc = jmxcl.connect(url.toString(), username, password);
利用するプロトコル名、アクセスする運用管理エージェントのホスト名、ポート番号からJMXServiceURLオブジェクトを生成します。WebOTXのデフォルトで作成されるdomain1に接続するためには上記コードのように"rmi"プロトコルは6212ポートを利用します。
JMXRemoteClientクラスを作成し、証明書ファイル(システムプロパティ「javax.net.ssl.trustStore」から取得)と証明書ファイルのパスワード(“changeit”)を指定します。
urlとユーザ名、パスワードを指定して運用管理エージェントに接続し、JMXConnectorオブジェクトを取得します。 urlはJMXServiceURLクラスから作成できますが、直接生成することもできます。直接生成する場合は次のフォーマットでurlを作成してください。
service:jmx:[protocol]://[host]:[port][url-path]
| パラメータ | 説明 |
|---|---|
| protocol |
|
| host | 運用管理エージェントのホスト名 |
| port |
protocolで指定したプロトコルのポート番号
|
| url-path | RFC 2609の仕様に従ったurlパス名。 |
// プロファイル情報格納領域の生成
HashMap env = new HashMap();
// SSLSocketFactoryの生成
tring truststore = System.getPropery("javax.net.ssl.trustStore");
char truststorepass[] = "changeit".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(truststore), truststorepass);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
SSLContext ctx = SSLContext.getInstance("TLSv1");
ctx.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory ssf = ctx.getSocketFactory();
// プロバイダ関数の登録
Security.addProvider( new com.nec.webotx.enterprise.admin.jmx.remote.plainclient.ClientProvider());
// プロファイル情報の設定
env.put("jmx.remote.profiles","TLS SASL/PLAIN");
env.put("jmx.remote.tls.socket.factory", ssf);
env.put("jmx.remote.tls.enabled.protocols", "TLSv1");
env.put("jmx.remote.tls.enabled.cipher.suites","SSL_RSA_WITH_NULL_MD5");
// コールバック関数の登録
env.put("jmx.remote.sasl.callback.handler"
, new com.nec.webotx.enterprise.admin.jmx.remote.client.UserPasswordCallbackHandler(user, password));
// URLの生成
// プロトコル RMI
// ホスト名 localhost
// 管理ポート番号 6212
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://host:6212/management/rmi-jmx-connector");
// JMXConnectorの生成
final JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
証明書ファイル(システムプロパティ「javax.net.ssl.trustStore」から取得)と証明書ファイルのパスワード(“changeit”)から認証情報を取得して、サーバ/クライアント間のSSL通信で利用するSSLSocketFactoryオブジェクトを作成します。証明書ファイルには、サーバ側の${INSTANCE_ROOT}/config/keystore.jksファイルに格納されている情報の認証情報が格納されている必要があります。作成したオブジェクトは、後でプロファイル情報として設定します。
WebOTX で使用するJMXMPプロトコルでは、SASL/PLAINを利用しています。SASL/PLAINのクライアント側の処理を提供するプロバイダ関数を設定します。この例で使用するプロバイダ関数は、${INSTALL_ROOT}/modules/jmx-remote-client.jarで提供されます。このクラスを使用する場合は、コンパイル時に jmx-remote-client.jar を、実行時に${INSTALL_ROOT}/lib/wo-client.jarをクラスパスに追加してください。
WebOTX で使用するJMXMPプロトコルを利用するための各プロファイル情報を設定します。これらの情報はサーバ/クライアントで一致させる必要があります。
SASL/PLAINで利用するcallback関数を設定します。この例で使用するコールバック関数は${INSTALL_ROOT}/modules/jmx-remote-client.jarで提供されます。このクラスを使用する場合は、コンパイル時に jmx-remote-client.jar を、実行時に${INSTALL_ROOT}/lib/wo-client.jarをクラスパスに追加してください。このコールバック関数の引数には、接続するドメインでotxadminグループに所属するユーザ名とパスワード情報を設定します。
利用するプロトコル名、アクセスする運用管理エージェントのホスト名、ポート番号を指定してJMXServiceURLオブジェクトを生成します。WebOTXのデフォルトで作成されるdomain1に接続するためには上記コードのようにプロトコルは"rmi"ポートは6212を指定します。
URLとプロファイル情報(env)を指定してJMXConnectorオブジェクトを生成します。
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
// オブジェクト名の検索
ObjectName objname = new ObjectName("*:*");
et objnames = mbsc.queryNames(objname,null);
for (final Iterator i=objnames.iterator();i.hasNext(); ) {
bjectName name = (ObjectName)i.next();
System.out.println("MBean: " + name);
}
JMXにおいてMBeanにはMBeanを一意に識別するオブジェクト名が割り当てられています。MBeanServerConnectionインタフェースでMBeanにアクセスするためのメソッドの引数には必ずオブジェクト名を指定します。そこでMBeanServerConnectionのインタフェースではMBeanの検索するためのメソッド(queryNames,queryMBeans)を提供しています。
queryNames,queryMBeansメソッドも引数は同じです。返却値が引数で指定した条件にマッチするObjectNameクラスのsetかMBeanクラスのsetかの違いがあるだけです。
queryNames,queryMBeansメソッドの第一引数はObjectNameです。このObjectNameでは以下のワイルドカードを使用することが可能です。指定したObjectNameにマッチするMBeanを検索することになります。
以下に例を示します。次のObjectNameでMBeansがMBeanServerに登録されると仮定します。デフォルトドメイン名は”DefaultDomain”とします。
MyDomain:description=Printer,type=laser MyDomain:description=Disk,capacity=2 DefaultDomain:description=Disk,capacity=1 DefaultDomain:description=Printer,type=ink DefaultDomain:description=Printer,type=laser,date=1993 Socrates:description=Printer,type=laser,date=1993
queryNames,queryMBeansメソッドの第二引数はQueryExpです。QueryExpはユーザ定義の属性値を基にMBeanのフィルタリング条件を指定します。なおQueryExpをnullに指定するとフィルタリングは行いません。
QueryExpは属性値のconstraints(数値については“equals”や”less-than”、文字列については”matches”のようなもの)から構成されています。このconstraintsは”and”や”or”のようなオペレーションも含みます。例えば次のようなExpressionが定義できます。
"Retrieve the MBeans for which the attribute age is at least 20 and the attribute name starts with G and ends with ling"
(属性”age”の値が少なくとも20であり、属性”name”の値がGから始まりlingで終わるMBeanを検索する)
上記のコーディング例ではオブジェクト名に”*:*”を指定しているのでドメインに登録されている全てのMBeanのオブジェクト名を取得できます。
MBeanの情報を取得するにはMBeanInfoを取得する必要があります。MBeanInfoを取得することによりそのMBeanがサポートする属性やオペレーションやNotificationの情報を取得することができます。
MBeanInfo info = mbsc.getMBeanInfo((ObjectName)name);
MBeanAttributeInfo[] attrs = info.getAttributes();
if (attrs != null){
for (int j=0; j<attrs.length; j++) {
System.out.println("attribute : " + attrs[j].getName());
}
}
MBeanOperationInfo[] ops = info.getOperations();
if (ops != null){
for (int j=0; j< ops.length; j++) {
System.out.println("operation : " + ops[j].getName());
}
}
MBeanNotificationInfo[] nts = info.getNotifications();
if (nts != null){
for (int j=0; j< nts.length; j++) {
System.out.println("nts : " + nts[j].getName());
}
}
MBeanInfoにはそのMBeanに関する以下の情報を取得することが出来ます。
MBeanの属性値を取得します。
// 属性の取得 Object attrValue = mbsc.getAttribute(name,attrs[j].getName()); System.out.println(attrs[j].getName() + " = " + attrValue);
属性を取得するにはMBeanServerConnectionの次のメソッドを呼び出します。
MBeanの属性値を設定します。
// 属性の設定
Attribute attr = new Attribute("description","sample test");
mbsc.setAttribute(,name,attr);
属性を設定するにはMBeanServerConnectionの次のメソッドを呼び出します。
MBeanのオペレーションを呼び出します。
// オペレーションの呼び出し Object retValue = mbsc.invoke(name, "start",null,null);
オペレーションを呼び出すにはMBeanServerConnectionのinvokeメソッドを呼び出します。
MBeanのNotificationを受信します。
SampleListener listener = new SampleListener(); mbsc.addNotificationListener(name, listener, null, null);
Notification受信をするためのNotificationリスナを作成します。javax.management.NotificationListenerインタフェースをimplementsしたリスナクラスを作成します。 Notificationイベントが発生した場合、handleNotificationオペレーションがコールバックされるのでhandleNotificationオペレーションを実装します。
Notificationを受信するにはNotificationリスナを登録する必要があります。MBeanServerConnectionのaddNotificationListenerメソッドを呼び出し、Notificationリスナを登録します。 登録が完了すると指定したMBeanで発生したNotificationイベントを受信することができます。