この章では、Java EE管理API群について説明します。これらのAPIを使用すると、ソフトウェア開発者は、JDBC接続プールやデプロイされているアプリケーションなどのリソースを検出して参照できる単体のJavaプログラムを、Java EE Webアプリケーション・サーバー上に作成できます。
Java EE管理仕様には、Java EE Webアプリケーション・サーバーおよびそのリソースの実行時状態をモニターおよび管理するための標準データ・モデルが記述されています。また、Java EE MEJB (Management EJB)コンポーネントによるモデルの標準マッピングも含まれています。
この章の内容は次のとおりです。
Java EE管理API群を使用すると、ソフトウェア開発者は、JDBC接続プールやデプロイされているアプリケーションなどのリソースをそれ1つで検出して参照できるJavaプログラムをJava EE Webアプリケーション・サーバー上に作成できます。このAPI群はJava EEの管理仕様の一部。Java EEの管理仕様では、すべてのJava EE Webアプリケーション・サーバーは標準データ・モデルでリソースを記述する必要があります。
以下の節では、WebLogic ServerでJava EE管理APIを使用する方法について説明します。
Java EE管理データ・モデルでは、Webアプリケーション・サーバー・リソース・タイプの各インスタンスはJava EE管理対象オブジェクト(JMO)によって表現されます。Java EE管理仕様では、どのタイプのリソースをJMOで表すべきかを厳密に定めています。JMO自体には、データ・モデルにオブジェクトの場所を記述する際に使用される、一連の限られた属性のみが含まれます。
Java EE管理仕様は、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のようになります。
Java EE管理仕様では、各タイプのJMOのオブジェクト名には名前と値のペアが必須であることが厳密に定められています。
それぞれの子JMOのオブジェクト名には、その親JMOのオブジェクト名の名前と値のペアが含まれます。あるサーバー・インスタンスのJMOの名前が次である場合
mydomain:j2eeType=J2EEServer,name=myserver
そのサーバー・インスタンスにデプロイされたアプリケーションの一部であるサーブレットのJMOの名前は次のようになります:
mydomain:J2EEApplication=myapplication,J2EEServer=myserver,WebModule=myapp_mywebmodule,j2eeType=Servlet,name=myservlet_name
名前と値のペアは、任意の順序でかまいません。
Java EE管理仕様のバージョン1.0では、Webアプリケーション・サーバーがJMOを実装し、JMOへのAPIアクセスを提供していることが必須事項です。
必要に応じて、パフォーマンス統計や管理操作を行ったり、指定されたイベントが発生したときに通知を送信したりするようにJMOを実装できます。
JavaアプリケーションからJMOへのアクセスは、MEJB (Management Enterprise Java Bean)のリモート・インタフェースであるjavax.management.j2ee.Managementを介して行われます。
Java EE管理仕様では、MEJBのホーム・インタフェースがサーバーのJNDIツリーにejb.mgmt.MEJBとして登録されている必要があります。
javax.management.j2eeパッケージのAPIリファレンス(http://docs.oracle.com/javaee/6/api/javax/management/j2ee/package-summary.html)を参照してください。
WebLogic Serverには、Java EE管理仕様バージョン1.1の必要な機能のみが実装されています。そのため、以下の制限があります。
JMOはパフォーマンス統計や管理操作、または通知の送信を行いません。
Common Information Model (CIM)へのマッピングは行いません。
SNMPの管理情報ベース(MIB)へのマッピングは行いません。
MEJBとJMOは管理サーバーでのみ使用できます。これはJava EE Management Modelと一貫性があります。Java EE Management Modelでは、論理的に関連のあるいくつかの集合内にほとんどのJava EE Webサーバーが存在し、その集合内にはサーバー・インスタンスへのアクセスやそれらの管理を行うための中枢があることを前提としています。Javaアプリケーションでは、WebLogic Serverドメインの任意のサーバー・インスタンスの任意のリソースを表すJMOを管理サーバーから参照できます。
WebLogic ServerではJMOをMBeanのラッパーとして実装しているため、JMOに対応するWebLogic Server MBeanに変更が加えられると、その変更はJava EE管理APIによってすぐに反映されます。
WebLogic ServerのすべてのJMOのオブジェクト名は、domain:の部分がWebLogic Serverドメインの名前と一致しています。
モニターするデータをMEJBを通じて取得するには以下を実行します。
ejb.mgmt.MEJBの下にある管理サーバーのJNDIツリーを介してjavax.management.j2ee.ManagementHomeインタフェースをルックアップします。
ManagementHomeを使用してMEJBのリモート・インタフェースであるjavax.management.j2ee.Managementのインスタンスを生成します。
例2-1のサンプル・クラスでは、WebLogic ServerドメインのMEJBにアクセスし、javax.management.j2ee.Management.queryNamesメソッドを呼び出します。このメソッドはドメイン内のすべてのJMOのオブジェクト名を返します。
例2-1: 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();
}
}
}
WebLogic Serverでは、標準のJava EEデプロイメント記述子と同様に、MEJBを使用してWebLogic固有のデプロイメント記述子にアクセスできるようにするJSR 77に対する拡張を実装します。productSpecificDeploymentDescriptor属性では、WebLogic固有の記述子ファイルのXMLの内容を返します。例2-2にこのメソッドの呼出し方法を示します。
例2-2 productSpecificDeploymentDescriptor
// Get the WLS specific deployment descriptor. // This is similar to the call for the standard descriptor // (i.e., the "deploymentDescriptor" attribute) // dd = (String) managementBean.getAttribute(objName, "productSpecificDeploymentDescriptor"); // It returns a string containing the contents of the WLS specific deployment // descriptor. This is the XML file contents as a string.