2 Java EE管理APIの使用

Java EE管理APIを使用して、Java EE Webアプリケーション・サーバー上のリソースを検出および参照できる単一のJavaプログラムを作成します。Javaプログラムのリソースの例は、JDBC接続プールおよびデプロイされたアプリケーションです。

Java EE管理APIはJava EE管理仕様の一部であり、Java EE管理仕様では、すべてのJava EE Webアプリケーション・サーバーは標準データ・モデルでリソースを記述する必要があります。Java EE管理仕様には、Java EE Webアプリケーション・サーバーおよびそのリソースの実行時状態をモニターおよび管理するための標準データ・モデルが記述されています。また、Java EE MEJB (Management EJB)コンポーネントによるモデルの標準マッピングも含まれています。

この章には、WebLogic ServerにおけるJava EE管理APIの使用方法を説明する次の各項があります。

Java EE管理モデルとAPIの理解

Java EE管理データ・モデルでは、定義済の管理EJBインタフェースを使用してJava EEプラットフォームによって提供される必要のある、一連の管理対象オブジェクトが定義されています。Java EE管理データ・モデルでは、Webアプリケーション・サーバー・リソース・タイプの各インスタンスはJava EE管理対象オブジェクト(JMO)によって表現されます。  

Java EE管理仕様では、どのタイプのリソースをJMOで表すべきかを厳密に定めています。JMO自体には、データ・モデルにオブジェクトの場所を記述する際に使用される、一連の限られた属性のみが含まれます。

Java EE管理仕様は、http://jcp.org/aboutJava/communityprocess/final/jsr077/index.htmlでダウンロードしてください。

JMOの階層

データ・モデルでは、JMOはツリー構造で階層状に構成されます。

ルートのJMO J2EEDomainは、論理的に関連付けられたWebアプリケーション・サーバー・インスタンスの集合を表します。J2EEDomainには、J2EEServer JMOのすべてのインスタンスのオブジェクト名が含まれ、各J2EEServer JMOは、その集合内にある1つのサーバー・インスタンスを表しています。

JavaアプリケーションではJMOの階層を参照して、オブジェクト名の問合せやその問合せ結果で指定される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 

名前と値のペアは、任意の順序でかまいません。

JMOの任意指定の機能

Java EE管理仕様のバージョン1.0では、Webアプリケーション・サーバーがJMOを実装し、JMOへのAPIアクセスを提供していることが必須事項です。必要に応じて、パフォーマンス統計や管理操作を行ったり、指定されたイベントが発生したときに通知を送信したりするようにJMOを実装できます。

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/7/api/javax/management/j2ee/package-summary.html)を参照してください。

WebLogic ServerでのJava EE管理モデル

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ドメインの名前と一致しています。

WebLogic ServerでのMEJBへのアクセス

Oracle WebLogic ServerのManagement Enterprise Beanコンポーネント(MEJB)インタフェースにアクセスできます。MEJBコンポーネントを使用して、WebLogicのモニタリング・データを問合せおよび取得します。

モニターするデータをMEJBを通じて取得するには:

  1. ejb.mgmt.MEJBの下にある管理サーバーのJNDIツリーを介してjavax.management.j2ee.ManagementHomeインタフェースをルックアップします。
  2. ManagementHomeを使用してMEJBのリモート・インタフェースであるjavax.management.j2ee.Managementのインスタンスを生成します。

例: JMOの名前の問合せ

javax.management.j2ee.Management.queryNamesメソッドを使用して、WebLogicドメイン内のJMOの名前を問い合せます。

例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拡張

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.