J2EE 管理 API によるモニタと管理
J2EE 管理 API 群を使用すると、ソフトウェア開発者は、JDBC 接続プールやデプロイされているアプリケーションなどのリソースをそれ 1 つで検出して参照できる Java プログラムを J2EE Web アプリケーション サーバ上に作成できます。この API 群は J2EE の管理仕様の一部です。J2EE の管理仕様では、すべての J2EE Web アプリケーション サーバは標準データ モデルでリソースを記述する必要があります。
以下の節では、WebLogic Server® で J2EE 管理 API を使用する方法について説明します。
J2EE Management データ モデルでは、Web アプリケーション サーバ リソース タイプの各インスタンスは J2EE 管理対象オブジェクト (JMO) によって表現されます。J2EE 管理仕様では、どのタイプのリソースを JMO で表すべきかを厳密に定めています。JMO 自体には、データ モデルにオブジェクトの場所を記述する際に使用される、一連の限られた属性のみが含まれます。
J2EE 管理仕様は、http://jcp.org/aboutJava/communityprocess/final/jsr077/index.html でダウンロードしてください。
データ モデルでは、JMO はツリー構造で階層状に構成されます。ルートの JMO J2EEDomain
は、論理的に関連付けられた Web アプリケーション サーバ インスタンスの集合を表します。J2EEDomain
には、J2EEServer
JMO のすべてのインスタンスのオブジェクト名が含まれ、各 J2EEServer
JMO は、その集合内にある 1 つのサーバ インスタンスを表しています。
Java アプリケーションでは JMO の階層を参照して、オブジェクト名のクエリやそのクエリ結果で指定される JMO のルックアップを再帰的に行えます。
各 JMO インスタンスは、javax.management.ObjectName
のユニークなオブジェクト名によって識別されます。オブジェクト名は、以下のパターンを使用します。
domain
:
name
=j2eeType=
value
,name=
value
,
parent-j2eeType[
,
property
=
value]*
たとえば mydomain:J2EEtype=J2EEDomain,name=mydomain
のようになります。
J2EE 管理仕様では、各タイプの JMO のオブジェクト名には名前と値のペアが必須であることが厳密に定められています。
それぞれの子 JMO のオブジェクト名には、その親 JMO のオブジェクト名の名前と値のペアが含まれます。あるサーバ インスタンスの JMO の名前が mydomain:j2eeType=J2EEServer,name=myserver
である場合、
そのサーバ インスタンスにデプロイされたアプリケーションの一部であるサーブレットの JMO の名前は次のようになります。
mydomain:J2EEApplication=myapplication,J2EEServer=myserver,WebModule=myapp_mywebmodule,j2eeType=Servlet,name=myservlet_name
J2EE 管理仕様のバージョン 1.0 では、Web アプリケーション サーバが JMO を実装し、JMO への API アクセスを提供していることが必須事項です。
必要に応じて、パフォーマンス統計や管理操作を行ったり、指定されたイベントが発生したときに通知を送信したりするように JMO を実装できます。
Java アプリケーションから JMO へのアクセスは、MEJB (Management Enterprise Java Bean) のリモート インタフェースである javax.management.j2ee.Management
を介して行われます。
J2EE 管理仕様では、MEJB のホーム インタフェースがサーバの JNDI ツリーに ejb.mgmt.MEJB
として登録されている必要があります。
javax.management.j2ee
パッケージの API リファレンス http://java.sun.com/j2ee/1.4/docs/api/javax/management/j2ee/package-summary.html を参照してください。
WebLogic Server 9.0 には、J2EE 管理仕様バージョン 1.0 の必要な機能のみが実装されています。そのため、以下の制限があります。
MEJB と JMO は管理サーバでのみ使用できます。これは J2EE Management Model と一貫性があります。J2EE Management Model では、論理的に関連のあるいくつかの集合内にほとんどの J2EE Web サーバが存在し、その集合内にはサーバ インスタンスへのアクセスやそれらの管理を行うための中枢があることを前提としています。Java アプリケーションでは、WebLogic Server ドメインの任意のサーバ インスタンスの任意のリソースを表す JMO を管理サーバから参照できます。
WebLogic Server では JMO を MBean のラッパーとして実装しているため、JMO に対応する WebLogic Server MBean に変更が加えられると、その変更は J2EE 管理 API によってすぐに反映されます。
WebLogic Server のすべての JMO のオブジェクト名は、domain
:
の部分が WebLogic Server ドメインの名前と一致しています。
モニタするデータを MEJB を通じて取得するには以下を実行します。
サンプル クラスでは、WebLogic Server ドメインの MEJB にアクセスし、javax.management.j2ee.Management.queryNames
メソッドを呼び出します。このメソッドはドメイン内のすべての JMO のオブジェクト名を返します。
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Set;
import java.util.Properties;
import javax.management.j2ee.Management;
import javax.management.j2ee.ManagementHome;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.ObjectName;
import javax.management.QueryExp;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ejb.CreateException;
public class GetJMONames {
static String url = "t3://localhost:7001";
static String user = "weblogic";
static String password = "weblogic";
public static void main(String[] args) {
try {
getAllJMONames();
}catch(Exception e){
System.out.println(e);
}
}
public static Management getMEJBRemote()
throws IOException, MalformedURLException,
NamingException,CreateException
{
Context context = getInitialContext();
ManagementHome home = (ManagementHome)
context.lookup("ejb.mgmt.MEJB");
Management bean = home.create();
return bean;
}
public static Context getInitialContext()
throws NamingException
{
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
p.put(Context.PROVIDER_URL, url);
if (user != null) {
p.put(Context.SECURITY_PRINCIPAL, user);
if (password == null)
password = "";
p.put(Context.SECURITY_CREDENTIALS, password);
}
return new InitialContext(p);
}
public static void getAllJMONames()
{
try {
Management rhome = getMEJBRemote();
String string = "";
ObjectName name = new ObjectName(string);
QueryExp query = null;
Set allNames = rhome.queryNames(name, query);
Iterator nameIterator = allNames.iterator();
while(nameIterator.hasNext()) {
ObjectName on = (ObjectName)nameIterator.next();
System.out.println(on.getCanonicalName() + "\n");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}