ヘッダーをスキップ
Oracle Containers for J2EE開発者ガイド
10g(10.1.3.5.0)
B56031-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

5 管理のためのMBeansの使用

この章では、OC4Jに登録されたJava Management Extensions(JMX)MBeanの使用手順を示します。OC4Jで提供されるMBeanについて説明し、アプリケーション固有のMBeanを作成してOC4Jに登録する手順を示します。この章の内容は次のとおりです。

この章はJMX MBeanおよびJMX APIに関する情報を示すものであり、正式なJMXドキュメントに置き換わるものではありません。詳細なJMXドキュメントは、次の場所にあるSun社のWebサイトのJMXページを参照してください。

http://java.sun.com/javase/6/docs/technotes/guides/jmx/index.html

MBeanの概要

MBeanつまりマネージドBeanは、アプリケーション、サービス、コンポーネントまたはデバイスなど、分散環境内の管理可能なリソースを表すJavaオブジェクトです。OC4Jには、OC4Jの管理および監視に使用される数多くのMBeanが事前に組み込まれています。また、アプリケーション固有のMBeanを作成してアプリケーション内にデプロイし、アプリケーションの管理に役立てることができます。MBeanを使用すると、MBeanクライアント(Oracle Enterprise Manager 10g Application Server Control、Java Monitoring and Management Console(JConsole)またはカスタムMBeanクライアントなど)を介してリソースを管理および監視できます。

J2EE関連のMBeanは、Sun社によって公開されているJ2EE 1.4仕様に含まれるJ2EE Management Specification(JSR-77)で定義されています。このJSRでは、J2EEに準拠するコンテナでサポートする必要のある一連の管理対象オブジェクトとそれに関連する機能が定義されています。OC4JはJSR-77に完全に準拠しています。JSR-77の詳細は、次の場所にあるJava Community Processサイトを参照してください。

http://jcp.org/en/jsr/detail?id=77.

MBeanが公開する管理インタフェースを使用することで、管理クライアントでリソースを管理できます。インタフェースは、属性、操作および通知で構成されています。

実際の管理機能は、OC4Jのサービスとして動作するOC4J MBeanサーバーによって提供されます。MBeanサーバーには、MBean(アプリケーションとともに提供されたMBeanを含む)の検出、インスタンス化およびアクセスを行う機能があります。MBeanサーバーで呼び出されたメソッドは、MBeanの属性と操作にアクセスし、MBeanのインスタンスを制御します。

Application Server ControlからMBeanへのアクセス

Oracle Enterprise Manager 10g Application Server Controlは、OC4J MBeanとアプリケーション固有のMBeanの両方を公開します。コンソールを使用して、MBean情報の表示、MBean属性の表示、およびMBean操作の起動を行うことができます。

システムMBeanブラウザを使用したOC4J MBeanへのアクセス

システムMBeanブラウザはOracle Enterprise Manager 10g Application Server Controlのコンポーネントであり、比較的簡単に使用できます。このブラウザで、すべてのOC4J MBeanを表示して使用できます。システムMBeanブラウザの使用方法の詳細は、『Oracle Containers for J2EE構成および管理ガイド』の「OC4JでのMBeanの使用」を参照してください。

システムMBeanブラウザを使用してOC4J MBeanにアクセスするには、次のようにします。

  1. Application Server Controlを起動します。

  2. 「管理」リンクをクリックします。

  3. 「システムMBeanブラウザ」の「タスクに移動」アイコンをクリックします。

  4. 特定のMBeanインスタンスには、コンソールの左側のナビゲーション・ペインからアクセスします。ナビゲーション・ペインでノードを開き、アクセスするMBeanにドリルダウンします。

  5. 右側のペインで「属性」タブをクリックして、選択したMBeanの属性にアクセスします。属性値を変更した場合は、「適用」ボタンをクリックして、OC4Jランタイムに変更を適用します。


    注意:

    「適用」ボタンが表示されるのは、値を更新できる属性がブラウザ・ページに少なくとも1つ存在する場合のみです。

  6. 「操作」タブをクリックして、MBeanの操作にアクセスします。特定の操作を選択した後、呼出しボタンをクリックして操作を呼び出します。

クラスタMBeanブラウザを使用したクラスタMBeanへのアクセス

クラスタMBeanブラウザはOracle Enterprise Manager 10g Application Server Controlのコンポーネントであり、スタンドアロンOC4Jインスタンス用のシステムMBeanブラウザとよく似ています。このブラウザで、すべてのクラスタMBeanを表示して使用できます。クラスタMBeanを使用すると、OC4Jインスタンス・グループに対して属性を表示し操作を実行することができます。クラスタMBeanブラウザは、OracleASの使用中のみ使用可能です。

クラスタMBeanブラウザを使用してクラスタMBeanにアクセスするには、次のようにします。

  1. Application Server Controlを起動します。「クラスタ・トポロジ」ページが表示されます。

  2. ページ下部にある「クラスタMBeanブラウザ」をクリックします。「クラスタMBeanブラウザ」ページが表示されます。

  3. 特定のMBeanインスタンスには、コンソールの左側のナビゲーション・ペインからアクセスします。ナビゲーション・ペインでノードを開き、アクセスするMBeanにドリルダウンします。

  4. 右側のペインで「属性」タブをクリックして、選択したMBeanの属性にアクセスします。属性値を変更した場合は、「適用」ボタンをクリックして、OC4Jランタイムに変更を適用します。


    注意:

    「適用」ボタンが表示されるのは、値を更新できる属性がブラウザ・ページに少なくとも1つ存在する場合のみです。

  5. 「操作」タブをクリックして、MBeanの操作にアクセスします。特定の操作を選択した後、呼出しボタンをクリックして操作を呼び出します。

アプリケーション固有のMBeanへのアクセス

J2EEアプリケーションとともにOC4Jにデプロイされているベンダー提供のMBeanには、Application Server Controlでアプリケーションのホームページからアクセスできます。OC4JシステムMBeanの場合と同様に、アプリケーション固有のMBeanに対して属性の表示と設定、および操作の実行を行うことができます。MBeanをアプリケーション内にパッケージし、OC4Jに登録する方法の詳細は、「アプリケーション固有のMBeanの作成」を参照してください。

アプリケーション固有のMBeanにアクセスするには、次のようにします。

  1. Application Server Controlのホームページから「アプリケーション」をクリックします。

  2. MBeanが含まれるアプリケーションの名前をクリックします。アプリケーションのホームページが表示されます。

  3. 「アプリケーション定義のMBean」リンクをクリックします。アプリケーションにより定義されているMBeanが、表示されたページに一覧表示されます。

  4. 右側のペインで「属性」タブをクリックして、選択したMBeanの属性にアクセスします。属性値を変更した場合は、「適用」ボタンをクリックして、OC4Jランタイムに変更を適用します。


    注意:

    「適用」ボタンが表示されるのは、値を更新できる属性がブラウザ・ページに少なくとも1つ存在する場合のみです。

  5. 「操作」タブをクリックして、MBeanの操作にアクセスします。特定の操作を選択した後、呼出しボタンをクリックして操作を呼び出します。

クライアント・アプリケーションからMBeanへのアクセス

JSR-160に準拠するコードを通してリモートOC4J MBeanServerにアクセスすることで、アプリケーションのMBeanをリモートで管理できます。JSR-160は、RMIを使用してリモートJMX対応のアプリケーションに接続するための標準APIです。これはJMXリモーティングとも呼ばれます。また、管理EJB APIを使用することもできます。この項の内容は次のとおりです。

前提条件: セキュリティ・グループにユーザーを追加する

oc4j-administratorsセキュリティ・グループに割り当てられたユーザーは、OC4Jに登録されたすべてのMBeanにアクセスできます。アプリケーションのMBeanへのアクセスを制限するには、ユーザーをoc4j-app-administratorsセキュリティ・グループに追加する必要があります。ユーザーをグループに追加するには、JAZN AdmintoolまたはWebベースのApplication Server Controlを使用します。

oc4j-app-administratorsセキュリティ・グループには、リモートOC4Jプロセスにログインしてメソッドを呼び出すためのパーミッションが必要です。またグループには、サーバーでのネームスペース読取りアクセス権も必要です。

セキュリティ・グループへのユーザーの追加に関する詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

JMXリモートAPI(JSR-160)を使用するリモート管理

JMX Remote API(JSR-160)により、クライアントはMBeanをリモートで使用できます。実際には、JSR-77で定義されているMEJBを使用するより利点が多く、リモート管理にはこの方が適しています。

  • MEJBを通して公開されるものよりも多くのMBeanServerの機能を利用できます。

  • 新しい接続プロトコルが利用可能になった場合に、それを使用するように準拠するコードを簡単に移行できます。

  • OC4JのJMXConnectorの実装はローカライゼーションとHTTPトンネリングをサポートし、これによってクライアントはファイアウォールを介してMBeanServerと通信できます。

    ORMI over SSL(ORMIS)もサポートされることに注意してください。セキュリティ・グループへのユーザーの追加に関する詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

  • JMXConnectorを使用すると、接続状態を監視することもできます。

  • Oracle JMXリモートAPIを通してOC4Jのadmin_client.jarツールを使用することで、Oracle Application Server環境にあるOC4JインスタンスまたはスタンドアロンOC4Jサーバーを管理できます。

    admin_client.jar、使用できるパッケージ、および指定する必要のあるクライアント・サイド・ライブラリの詳細は、『Oracle Containers for J2EE構成および管理ガイド』を参照してください。

OC4JではJRMPではなくORMIを使用するため、Oracle JMXリモートAPIの実装には他のJSR-160の実装との互換性がありません。

JMXリモートAPIで定義されている標準のコネクタは、RMIプロトコルを介したMBeanServerへのリモート・アクセスをJavaクライアントに提供します。OC4Jの実装では、コネクタはOC4J MBeanServerにアタッチされます。実際の管理はプロキシを通して行われます。プロキシ・インスタンスで呼び出されるメソッドごとに、対応するメソッドがリモートMBeanServerで呼び出されます。

次ではAPIの使用方法について説明します。

OC4J MBeanServerへの接続

次のサンプル・コードでは、JMXConnectorインスタンスを作成し、それを使用して、JMXServiceURLオブジェクトとして定義されるターゲットのOC4Jインスタンスに接続します。OC4J MBeanServerに対するプロキシとして機能するMBeanServerConnectionインスタンスが取得されます。プロキシを使用すると、MBeanServerの操作で管理操作を実行できます。この場合は、MBeanServerに登録されているすべてのMBeanを取得します。


注意:

この項で説明する方法で接続するには、ユーザーにoc4j-administratorsロールを割り当てる必要があります。このロールは、MBeanServerおよびそれに登録されているすべてのMBean(OC4JのシステムMBeanとアプリケーション定義のMBeanを含む)に対する完全なアクセス権限を付与します。

デフォルトのOC4J管理ユーザーであるoc4jadminは、このロールのメンバーです。

ユーザーにoc4j-administratorsロールを割り当てずに、特定のアプリケーションのMBeanにアクセスできるようにするためのガイドラインについては、「特定のアプリケーションのJMXドメインへの接続」を参照してください。


後述のサンプル・コードでは、次のJMXクラスとインタフェースのインポートが指定されます。

  • javax.management.remote.JMXConnectorインタフェース

    JMXコネクタのクライアント・エンドを定義します。

  • javax.management.remote.JMXConnectorFactoryクラス

    JMXコネクタのクライアントを作成するためのメソッドを含むファクトリです。

  • javax.management.remote.JMXServiceURLクラス

    接続ターゲットを定義するURLを作成します。コンストラクタは、パラメータとして1つ以上のStringオブジェクトを取ります。これにより、OPMN管理のOC4Jインスタンスにアクセスするために必要なデータを含むOPMNルックアップURLを定義するString変数が、コンストラクタに渡されます。

    String url="service:jmx:rmi:///opmn://oc4jhost1:6003/home"
    ...
    JMXServiceURL serviceUrl= new JMXServiceURL(url);
    

    Oracle Application Serverのコンポーネントとして実行されているOPMN管理のOC4Jインスタンスに接続する方法については、「OPMNで管理されるOC4Jインスタンスに対するJMXサービスURIの設定」を参照してください。

    スタンドアロンのOC4J環境で接続する方法については、「スタンドアロンOC4Jインスタンスに対するJMXサービスURIの設定」を参照してください。

  • javax.management.MBeanServerConnectionインタフェース

    OC4J MBeanServerで操作を実行するためのプロキシを定義します。

これらのJMXクラスおよびインタフェースに加えて、OC4J JMXコネクタ・クライアントが使用する定数を利用できるようにするため、oracle.oc4j.admin.jmx.remote.api.JMXConnectorConstantクラスがインポートされます。このクラスをインポートするかわりに、このクラスで定義されているキーをコードで直接使用することで、Oracle APIをコードに導入しない方法もあります。クラスで定義されている定数は次のとおりです。

  • CREDENTIALS_LOGIN_KEY

    サーバーのログイン名を格納します。

  • CREDENTIALS_PASSWORD_KEY

    サーバーのログイン・パスワードを格納します。

  • LOCALE

    接続を介してアクセスされるMBeanのメタデータ、属性およびメソッドをローカライズするために使用されるLocaleを格納します。接続インスタンスのローカライズの詳細は、「ロケールの設定」を参照してください。

  • HTTP_TUNNELING

    HTTPトンネリングが有効かどうかを示すブール型の値を格納します。HTTPトンネリングの有効化の詳細は、「HTTPトンネリングの有効化」を参照してください。

// Import the JSR-160 classes and interfaces from jmx_remote_api.jar
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.JMXConnectorFactory;

// Import the JMX 1.2 class
import javax.management.MBeanServerConnection;

// Import OC4J specific constant values. You can optionally use
// the values specified in this class to avoid introducing
// any Oracle-specific code.
import oracle.oc4j.admin.jmx.remote.api.JMXConnectorConstant;

....
// Create a variable for a URL containing data needed to access
// the connection target; in this case, an OPMN-managed OC4J instance
String url="service:jmx:rmi:///opmn://opmnhost1.company.com:6003/home"

JMXConnector jmxCon= null;

try {
// Define the connection target
JMXServiceURL serviceUrl= new JMXServiceURL(url);

// Use to pass environment properties to be used while
// retrieving a connection
Hashtable env= new Hashtable();

// Define the provider root package
env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
 "oracle.oc4j.admin.jmx.remote");

Hashtable credentials= new Hashtable();
// Connect using the oc4jadmin super-user administrator account
credentials.put(JMXConnectorConstant.CREDENTIALS_LOGIN_KEY,"oc4jadmin");
credentials.put(JMXConnectorConstant.CREDENTIALS_PASSWORD_KEY,"password");

// Specify the login/password to use for the connection
env.put(JMXConnector.CREDENTIALS, credentials);

// Get an instance of the JMXConnector interface for OC4J's rmi protocol
// User is not yet connected
jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

// Connect to the target OC4J instance defined in the JMXServiceURL
jmxCon.connect();

// Retrieve the MBeanServerConnection instance that acts as a proxy
// for the OC4J MBeanServer we are connecting to.
MBeanServerConnection con= jmxCon.getMBeanServerConnection();

// Use the MBeanServerConnection instance to perform remote
// operations on the OC4J MBeanServer. This call retrieves
// all MBeans registered with the server.
Set mbeans= con.queryNames(null, null);

// Display each MBean's ObjectNameIterator iter= mbeans.iterator();
while(iter.hasNext())
System.out.println(iter.next().toString());
}

// Important!!! Release the connection, ideally using a Finally block
finally {
if(jmxCon!=null)
 jmxCon.close();
}

アプリケーション固有のMBeanサーバーへの接続

アプリケーションでは、OC4J MBeanServerを使用するかわりに、汎用MBeanServerインスタンスを作成して接続することもできます。これは、たとえば、OC4Jのみでなく、複数のJ2EEコンテナに移植できる必要があるアプリケーションを作成するような場合に有効です。

この例では、MBeanServerに対してデフォルトのドメインを提供します。MBeanServerインスタンスを作成して、MBeanServerFactoryに登録します。

次に示す例では、MBeanServerインスタンスを作成し、myservというドメインに登録しています。このMBeanServerインスタンスに固有のコードは、太字で強調して示してあります。

// Import the JSR-160 classes and interfaces from jmx_remote_api.jar
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.JMXConnectorFactory;

// Import the JMX 1.2 class
import javax.management.MBeanServerConnection;

// Import OC4J specific constant values. You can optionally use
// use the values specified in this class to avoid introducing
// any Oracle-specific code.
import oracle.oc4j.admin.jmx.remote.api.JMXConnectorConstant;

....
// Create a variable for a URL containing data needed to access
// the connection target; in this case, an OPMN-managed OC4J instance
String url="service:jmx:rmi:///opmn://opmnhost1.company.com:6003/home"

JMXConnector jmxCon= null;

try {
// Define the connection target
JMXServiceURL serviceUrl= new JMXServiceURL(url);

// Use to pass environment properties to be used while
// retrieving a connection
Hashtable env= new Hashtable();

// Define the provider root package
env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
 "oracle.oc4j.admin.jmx.remote");

Hashtable credentials= new Hashtable();

// Connect using the oc4jadmin administrator account
credentials.put(JMXConnectorConstant.CREDENTIALS_LOGIN_KEY,"oc4jadmin");
credentials.put(JMXConnectorConstant.CREDENTIALS_PASSWORD_KEY,"password");

// Specify the login/password to use for the connection
env.put(JMXConnector.CREDENTIALS, credentials);

// Specify the application-specific MBeanServer default domain name
// used at creation time for the MBeanServer the application will connect to.
// The domain name specified here is "myserv".
env.put(JMXConnectorConstant.PROPRIETARY_MBEANSERVER_DOMAIN_NAME, "myserv");

// Get an instance of the JMXConnector interface for OC4J RMI protocol
// User is not yet connected
jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

// Connect to the target OC4J instance defined in the JMXServiceURL
jmxCon.connect();

// Retrieve the MBeanServerConnection instance that acts as a proxy
// for the OC4J MBeanServer we are connecting to.
MBeanServerConnection con= jmxCon.getMBeanServerConnection();

// Use the MBeanServerConnection instance to perform remote
// operations on the OC4J MBeanServer. This call retrieves
// all MBeans registered with the server.
Set mbeans= con.queryNames(null, null);

// Display each MBean's ObjectNameIterator iter= mbeans.iterator();
while(iter.hasNext())
System.out.println(iter.next().toString());
}

// Important!!! Release the connection, ideally using a Finally block
finally {
if(jmxCon!=null)
 jmxCon.close();
}

特定のアプリケーションのJMXドメインへの接続

oc4j-administratorsロールに割り当てられたユーザーは、MBeanServerに登録されたすべてのMBeanにアクセスできるため、すべてのユーザーにこのロールを割り当てるのは望ましくありません。

ただし、このロールを割り当てられていないユーザーでも、アプリケーションで登録されたMBeanにのみアクセスできるようにすることができます。この場合、ユーザーはアプリケーション・レベルで接続し、アプリケーションによって登録されたMBeanのみが見えます。

コードは、前の「OC4J MBeanServerへの接続」で示したものとほとんど同じですが、JMXServiceURLコンストラクタに渡すurlにアプリケーションの名前を含めることだけが違います。次に示す例では、hello-worldアプリケーションで登録されたMBeanにアクセスできるようにしています。

// Create a variable for a URL containing data needed to access
// the connection target; in this case, an OPMN-managed OC4J instance
String url="service:jmx:rmi:///opmn://opmnhost1.company.com:6003/home/hello-world"

JMXConnector jmxCon= null;

try {
// Define the connection target
JMXServiceURL serviceUrl= new JMXServiceURL(url);
...

Oracle Application Serverのコンポーネントとして実行されているOPMN管理のOC4Jインスタンスに接続する方法については、「OPMNで管理されるOC4Jインスタンスに対するJMXサービスURIの設定」を参照してください。

スタンドアロンのOC4J環境で接続する方法については、「スタンドアロンOC4Jインスタンスに対するJMXサービスURIの設定」を参照してください。

OPMNで管理されるOC4Jインスタンスに対するJMXサービスURIの設定

Oracle Application Serverの環境では、JMX接続に必要なOC4Jインスタンスに対するRMIポートは固定ではなく、インスタンスがOPMNによって開始されるたびに変わる可能性があります。

この問題を解決するには、OPMNベースのURLをJMXServiceURLコンストラクタに渡す必要があります。このURLは、OPMNでの間接的なルックアップを提供し、接続に必要なRMIポートを返します。

特定のOPMN管理のOC4Jインスタンス上のMBeanServerに接続するために使用されるOPMNルックアップURIの構文は、次のとおりです。

service:jmx:rmi|ormi:///opmn://opmnHost:[opmnPort]/oc4jInstanceName/[appName]

クラスタMBeanServerに接続するには、次のURIを指定します。/clusterを含めることに注意してください。これは、接続が特定のOC4JインスタンスのMBeanServerではなく、クラスタMBeanServerに対するものであることを示します。

service:jmx:rmi:///opmn://opmnHost:[opmnPort]/cluster/[ASInstanceName
/[Oc4jCompName]

ASInstanceNameパラメータおよびOc4jCompNameパラメータはオプションですが、接続先のOracle Application ServerまたはOC4Jインスタンス、もしくはその両方を指定することをお薦めします。指定しないと、クラスタ内でランダムに選択されたOC4Jプロセスに接続します。その結果、新しい接続が取得されるたびに、クラスタMBeanServerの新しいインスタンスが作成される場合があります。ASInstanceNameOc4jCompNameの両方を指定することが推奨される方法です。このようにすると、クラスタMBeanServerの単一のインスタンスとの接続が取得されます。OPMNは必要に応じてOC4Jプロセスを自動的に再起動するので、そのプロセスが常に利用できることが保証されます。たとえば、次に示す例では、as101というOracle Application Serverインスタンスの、adminというOC4Jインスタンス内のクラスタMBeanServerに接続しています。

service:jmx:rmis:///opmn://stadp69:6003/cluster/as101/admin

表5-1に、クラスタMBeanServerサービスのURIパラメータとその値を示します。

表5-1 URIパラメータ

パラメータ

hostname

OPMNホストの名前(oc4jhost1など)。この値は必須です。

port

OPMNリクエスト・ポート。この値は、opmn.xml<port>要素のrequest属性で指定します。

指定しないと、デフォルト値の6003が使用されます。

oc4jInstanceName

特定のOC4J MBeanServerに対してのみ有効。OC4Jインスタンスの名前です。この値は必須です。

Oracle Application Serverで作成されるデフォルトのOC4Jインスタンスの名前はhomeです。ターゲット・ホスト上のこのインスタンスに接続するには、/homeと指定します。

appName

特定のOC4J MBeanServerに対してのみ有効。アクセスする特定のアプリケーションのオプションの名前(/petstoreなど)。指定しないと、すべてのアプリケーションに対する無制限の接続が返されます。

このオプションは、oc4j-administratorsロールが割り当てられていないユーザーに対して、特定のアプリケーションのMBeanに対するアクセスを許可するために使用します。接続はアプリケーション・レベルで行われるため、ユーザーはそのアプリケーションによって登録されたMBeanにのみアクセスできます。

ASInstanceName

クラスタMBeanServerに対してのみ有効。接続するOracle Application Serverインスタンスのオプションの名前です。この値は、opmn.xml<ias-instance>要素のid属性で指定します。

Oc4jCompName

クラスタMBeanServerに対してのみ有効。接続するOC4Jインスタンスの名前です。この値は、opmn.xml<process-type>要素のid属性で指定します。

ASInstanceNameを指定しないでこのパラメータを指定する場合は、OC4Jインスタンスが稼働しているOracle Application Serverインスタンスに対して、portパラメータを指定する必要があります。


次のURLは、指定されているホストのhome OC4JインスタンスにデプロイされているすべてのアプリケーションMBeanに対する無制限のJMXアクセスを提供します。ポートの値が省略されているため、デフォルトが使用されることに注意してください。

service:jmx:rmi:///opmn://opmnhost1/home

次に示す例では、petstoreアプリケーションによって登録されたMBeanのみにアクセスできるようにしています。接続ターゲットは、指定されているホスト上のhome02インスタンスです。ポートの値が指定されていることに注意してください。

service:jmx:rmi:///opmn://opmnhost1:6008/home02/petstore

OPMNで管理されるOC4Jインスタンスに対するセキュアなJMXサービスURIの設定

次のURIは、クラスタMBeanServerにアクセスします。

service:jmx:rmis:///opmn://opmnHost:opmnPort/cluster/[ASInstanceName]/Oc4jCompName

スタンドアロンOC4Jインスタンスに対するJMXサービスURIの設定

OC4Jが自己完結型のコンポーネントとして直接的にインストール、管理、起動および停止されるスタンドアロンのOC4Jインストール環境では、RMIポートは固定されています。接続パラメータを含むURLをJMXServiceURLコンストラクタに渡して、OC4Jサーバーに直接接続できます。

スタンドアロンのOC4Jインストールで使用されるルックアップURLの構文は次のとおりです。

service:jmx:rmi|ormi://[hostname]:[rmiPort/]oc4jContextRoot/[appName]

次に例を示します。

service:jmx:rmi://oc4jhost:23791/oc4j/petstore

表5-2に、URLパラメータとその値を示します。

表5-2 URLパラメータ

パラメータ

hostname

オプション。OC4Jホストの名前(oc4jhost1など)。指定しない場合のデフォルトはlocalhostです。

rmiPort

オプション。接続するRMIポートです。指定しないと、デフォルト値の23791が使用されます。

oc4jcontextRoot

必須。サーバー上のOC4JがインストールされているディレクトリへのURLパス(/oc4j)。OC4JインスタンスのローカルなMBeanServerインスタンスを示すには、/oc4jコンテキスト・ルートを使用します。この値は必須です。

appName

オプション。アクセスする特定のアプリケーションの名前(/petstoreなど)。指定しないと、すべてのアプリケーションに対する無制限の接続が返されます。

このオプションは、oc4j-administratorsロールが割り当てられていないユーザーに対して、特定のアプリケーションのMBeanに対するアクセスを許可するために使用します。接続はアプリケーション・レベルで行われるため、ユーザーはそのアプリケーションによって登録されたMBeanにのみアクセスできます。


スタンドアロンOC4Jインスタンスに対するセキュアなJMXサービスURIの設定

ORMI over SSL(ORMIS)を使用して、管理クライアントとOC4J MBeanServerの間の接続を保護することができます。この機能を使用するには、前述のJMXサービスURIの構文で、rmiまたはormirmisまたはormisに置き換えるだけです。次の例ではORMISポート23943が指定されています。

service:jmx:rmis://oc4jhost:23943/oc4j/petstore

ターゲットのOC4Jサーバーが、ORMISを使用するように構成されている必要があります。ORMISを有効にする方法については、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

ロケールの設定

JMXConnectorFactory.newJMXConnector()メソッドまたはJMXConnector.connect()メソッドに渡される追加の環境プロパティを設定することで、特定のLocaleと接続を関連付けることができます。OC4J固有のoracle.oc4j.admin.jmx.api.JMXConnectorConstantクラスのLOCALE定数を使用して、このプロパティを設定できます。次に例を示します。

env.put(JMXConnectorConstant.LOCALE, Locale.FRENCH)

ローカライゼーションを使用するには、「MBeanへのローカライゼーション・サポートの追加」で示されているように、管理対象のMBeanでローカライゼーションをサポートしている必要があります。

HTTPトンネリングの有効化

クライアントまたはOC4Jサーバー、あるいはその両方が、HTTPトラフィックのみを許可するファイアウォールの背後で保護されている場合には、HTTPを介してRMIトラフィックをトンネルするようにJMX RMIコネクタを構成し、ファイアウォールの両側での通信を可能にできます。

HTTPトンネリングでは、RMI呼出しはHTTPのPOSTリクエスト内にカプセル化されます。応答も同様に、HTTPにカプセル化されたデータとして返されます。

HTTPトンネリングを有効にするには、oracle.oc4j.admin.jmx.api.JMXConnectorConstantクラスのHTTP_TUNNELING定数の値にrmiTunnelサーブレットへのパスを設定し、それをJMXConnectorFactory.newJMXConnector()メソッドまたはJMXConnector.connect()メソッドに対する環境プロパティとして渡します。次に例を示します。

env.put(JMXConnectorConstant.HTTP_TUNNELING, "j2ee/rmiTunnel")


JMXConnectionインスタンスを取得するために使用するJMXServiceURLオブジェクトのポート値には、前述の接続例で示したようなRMIポートではなく、ターゲットのOC4JインスタンスのHTTPポートを設定する必要があることに注意してください。OC4JのデフォルトのHTTPリスナー・ポートは、スタンドアロンOC4Jでは8888、Oracle Application Server環境では7777です。

JMXServiceURL serviceUrl= new JMXServiceURL("rmi","oc4j-sun.acme.com", 8888,"/oc4j");

OC4JでRMI HTTPトンネリングを構成する方法については、『Oracle Containers for J2EEサービス・ガイド』を参照してください。

管理EJB(JSR-77)を使用するリモート管理

OC4JはJ2EE管理仕様(JSR-77)に準拠しているため、OC4Jの実装とともにデプロイされる管理EJB(MEJB)を通じてMBeanをリモート管理できます。MEJBはOC4J MBeanServerに対するリモート・インタフェースを提供するステートフル・セッションBeanであり、OC4Jインスタンスで稼働するMBeanに対するリモート・ユーザーの問合せとアクセスを可能にします。

MEJBはJMXのクラスとインタフェースを使用します。javax.management.j2ee.ManagementインタフェースがMEJBリモート・インタフェースであるのに対し、javax.management.j2ee.ManagementHomeインタフェースはMEJBインスタンスを作成する単一のメソッドを含みます。MEJBは、JNDI名ejb/mgmt/MEJBで使用できます。

次ではMEJBの使用方法について説明します。

J2EEアプリケーション・クライアントからのMEJBへのアクセス

次に示すコードを使用すると、アプリケーション・クライアントでMEJBを使用できます。アプリケーション・クライアントからMEJBにアクセスすると、ローカルとリモートの両方の操作を実行できることに注意してください。

import javax.naming.*;

// Import the MEJB interface
import javax.management.j2ee.Management;
import javax.management.j2ee.ManagementHome;

.....

Hashtable env = new Hashtable();

// Set the connection target
String url = "ormi://host.company.com:23791/default";

// Set the login context
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_PRINCIPAL, "oc4jadmin");
env.put(Context.SECURITY_CREDENTIALS, "welcome");
env.put(Context.INITIAL_CONTEXT_FACTORY,
  "com.evermind.server.ApplicationClientInitialContextFactory");

// Look up the MEJB Home interface and create the MEJB
Context ctx = new InitialContext(environment);
Object hm= ctx.lookup("java:comp/env/ejb/mgmt/MEJB");
ManagementHome mgmtHome=
 (ManagementHome)PortableRemoteObject.narrow(hm,ManagementHome.class);
Management mejb=  mgmtHome.create();

.....

mejb.remove();

サーブレットまたはEJBからのMEJBへのアクセス

次に示すコードを使用すると、ターゲットのOC4Jインスタンス内で稼働するサーブレットまたはEJBモジュールからMEJBを使用できます。接続の対象は実行しているコンテナであるため、ログインとパスワードのデータは指定せずに、実行しているスレッド・コンテキストから取得します。このため、認証するユーザーはoc4j-administratorsセキュリティ・グループに属する必要があります。

グループへのユーザーの追加に関する詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

import javax.naming.*;

// Import the JSR-77 MEJB interface
import javax.management.j2ee.Management;
import javax.management.j2ee.ManagementHome;

.....

// Look up the MEJB Home interface and create the MEJB
Context ctx= new InitialContext();
Object hm= ctx.lookup("java:comp/env/ejb/mgmt/MEJB");
ManagementHome mgmtHome=
 (ManagementHome)PortableRemoteObject.narrow(hm,ManagementHome.class);
Management mejb=  mgmtHome.create();

.....

mejb.remove();

MBeanの使用例

この項では、システムMBeanブラウザ、クラスタMBeanブラウザおよびクライアント・コードを使用してOC4J MBeanにアクセスする方法を示した基本的なMBeanの例をいくつか示します。ここでは、スタンドアロンの例とグループ・ベースの例を両方示しています。

この項には、次の内容が含まれています。

前提条件

MBeanの使用例は解説を目的としたものであり、OC4J MBeanを使用して実行できるすべてのタスクの完全なリストを示すものではありません。

この項に示すタスクを完了するには、次の項目が必要です。

  • スタンドアロンの例では、Application Server Controlにアクセスできる実行中のOC4Jインスタンスが必要です。グループ・ベースの例では、完全なOracleAS環境が必要です。グループ・ベースの例で使用する設定では、アプリケーション・サーバー・インスタンスが1つと、3つのOC4Jインスタンスが含まれるOC4Jグループが1つ存在します。また、グループ・ベースの例でもApplication Server Controlへのアクセスが必要です。

  • OC4J管理アクセス(つまり、oc4j-administratorsセキュリティ・グループ内のメンバーシップ)。

  • JMXリモートAPIクライアントの例では、JAR(adminclient.jarejb.jarおよびoc4jclient.jar)が必要です。これらのJARは、admin_client.jarによっても参照されます。これを使用すると、クラスパスに各JARを個別に挿入する必要がありません。

    これらのJARは管理クライアント・ユーティリティの一部としてOC4Jとともに配布されます。管理クライアント・ユーティリティは、Companion CDから、またはOracle Technology Networkからダウンロードして入手できます。

    http://www.oracle.com/technology/software/products/ias/htdocs/utilsoft.html

JMXリモート・クライアントの例では、MBeanオブジェクトを作成するためにMBeanに固有のJMX名を使用しています。次の例で、MBeanに固有のJMX名を示します。

oc4j:j2eeType=ThreadPool,name=system,J2EEServer=standalone

MBeanに固有のJMX名は、特定のMBeanにアクセスするときに、システムMBeanブラウザおよびクラスタMBeanブラウザで確認できます。JMX名は、ページ上部にあるNameフィールドに表示されます。

最後に、多くの例でMBeanプロキシ・インタフェースを使用しています。プロキシの名前はMBeanと同じですが、末尾にProxyが付いています(たとえば、J2EEApplicationMBeanProxy)。MBeanのプロキシや使用可能なメソッドを含む完全なMBeanのリストについては、http://download.oracle.com/docs/cd/B31017_01/web.1013/e10288/toc.htmにある「MBean Java API Reference」を参照してください。

スタンドアロンOC4Jの例

この項に示す例では、MBeanを使用してスタンドアロンOC4Jインスタンスで一般的な管理タスクを実行する方法を示します。この項に示す例は次のとおりです。

スレッド・プール・プロパティの変更

この例では、ThreadPool MBeanを使用して、HTTP、JCAおよびシステム・スレッド・プール・プロパティを変更しています。OC4Jスレッド・プールの詳細は、『Oracle Containers for J2EE構成および管理ガイド』のOC4Jスレッド・プールの構成に関する項を参照してください。

システムMBeanブラウザからのHTTPスレッド・プール・プロパティの変更

システムMBeanブラウザからHTTPスレッド・プール・プロパティを変更するには、次のようにします。

  1. 「システムMBeanブラウザ」ページから「ThreadPool」ノードを開き、「http」をクリックします。

  2. 属性のリストからkeepAliveTime属性を見つけ、「値」フィールドに新しい値を入力します。

  3. 属性のリストからmaxPoolSize属性を見つけ、「値」フィールドに新しい値を入力します。

  4. 属性のリストからminPoolSize属性を見つけ、「値」フィールドに新しい値を入力します。

  5. 「適用」をクリックします。

クライアントからのシステム・スレッド・プール・プロパティの変更

次のクライアント例では、ThreadPoolMBeanProxyインタフェースを使用してシステム・スレッド・プロパティを更新しています。

package com.oracle.test;

import java.util.Hashtable;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.mbeans.proxies.ThreadPoolMBeanProxy;

public class UpdateThreadPool {
   public UpdateThreadPool() {
   }

   private JMXConnector connect (String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         UpdateThreadPool ctp = new UpdateThreadPool();
         JMXConnector connection =
            ctp.connect("service:jmx:rmi://host:23791", "user", "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myThreadTest = new
         ObjectName("oc4j:j2eeType=ThreadPool,name=system,J2EEServer=standalone");
         ThreadPoolMBeanProxy TPMBean =
            MBeanServerInvocationHandler.newProxyInstance(mbs, myThreadTest,
            ThreadPoolMBeanProxy.class, false);

         TPMBean.setminPoolSize(10);
         TPMBean.setmaxPoolSize(1024);
         TPMBean.setkeepAliveTime(660000);
         System.out.println(TPMBean.getpoolSize());

         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

OC4Jサーバーの停止

この例では、J2EEServer MBeanを使用してOC4Jサーバーを停止しています。

システムMBeanブラウザからのOC4Jサーバーの停止

システムMBeanブラウザからスタンドアロンOC4Jサーバーを停止するには、次のようにします。

  1. 「システムMBeanブラウザ」ページから「J2EEServer」ノードを開き、「スタンドアロン」をクリックします。J2EEServer: スタンドアロン・ページが表示されます。

  2. 「操作」をクリックします。

  3. 「次の3」をクリックします。

  4. 操作のリストから「停止」をクリックします。「停止」ページが表示されます。

  5. 「呼出し操作」をクリックします。

クライアントからのOC4Jサーバーの停止

次のクライアント例では、J2EEServerMBeanProxyインタフェースを使用して、クラスタ内に存在するOC4Jサーバーを停止しています。

package com.oracle.test;

import java.util.Hashtable;
import javax.management.MBeanServerConnection
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.mbeans.proxies.J2EEServerMBeanProxy;

public class ServerLifeCycle {
   public ServerLifeCycle() {
   }

   private JMXConnector connect (String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);
         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         ServerLifeCycle slc = new ServerLifeCycle();
         JMXConnector connection =
            slc.connect("service:jmx:rmi:///opmn://host:6003/Oc4JCompName ",
            "user", "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myServerTest = new
            ObjectName("oc4j:j2eeType=J2EEServer,name=standalone");
         J2EEServerMBeanProxy jsmb =
            MBeanServerInvocationHandler.newProxyInstance(mbs, myServerTest,
            J2EEServerMBeanProxy.class, false);

         System.out.println("stopping "+jsmb.getinstanceName());
         jsmb.stop();

         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

マネージド・データソースの追加

この例では、J2EEApplication MBeanを使用して、マネージド・データソースをデフォルト・アプリケーションに追加しています。データソースの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。

システムMBeanブラウザからのマネージド・データソースの追加

システムMBeanブラウザからマネージド・データソースを追加するには、次のようにします。

  1. 「システムMBeanブラウザ」ページから「J2EEApplication」ノードを開き、「デフォルト」をクリックします。J2EEApplication: デフォルト・ページが表示されます。

  2. 「操作」をクリックします。

  3. 操作のリストから「createManagedDataSource」をクリックします。「createManagedDataSource」ページが表示されます。

  4. 提供されたフィールドおよび手順を使用して、データソース・パラメータを入力します。

  5. 「呼出し操作」をクリックします。

クライアントからのマネージド・データソースの追加

次のクライアント例では、J2EEApplicationMBeanProxyインタフェースを使用して、マネージド・データソースをデフォルト・アプリケーションに追加しています。この例では、前述のJAR以外にoc4j-internal.jarライブラリが必要です。このJARは、ORACLE_HOME/j2ee/home/lib/にあります。

package com.oracle.test;

import java.util.Hashtable;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.mbeans.proxies.J2EEApplicationMBeanProxy;

public class AddManagedDS {
   public AddManagedDS() {
   }

   private JMXConnector connect (String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         AddManagedDS amds = new AddManagedDS();
         JMXConnector connection =
            amds.connect("service:jmx:rmi://host:23791", "user", "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myManagedDS = new
            ObjectName("oc4j:j2eeType=J2EEApplication,name=default,
            J2EEServer=standalone");
         J2EEApplicationMBeanProxy jamb =
            MBeanServerInvocationHandler.newProxyInstance(mbs,
            myManagedDS, J2EEApplicationMBeanProxy.class, false);

         jamb.createManagedDataSource("MyDataSource", "scott", "tiger",
            "jdbc/myDataSource", 30, "Example Connection Pool", "local", "null");

         System.out.println("the following data sources are available:
            "+jamb.listDataSources());

         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

データソース接続プール・プロパティの更新

この例では、J2EEApplication MBeanを使用して、デフォルト・アプリケーションで定義されている接続プールに接続プール・プロパティを追加しています。データソース接続プールの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。

システムMBeanブラウザからの接続プール・プロパティの追加

システムMBeanブラウザから接続プール・プロパティを追加するには、次のようにします。

  1. 「システムMBeanブラウザ」ページから「J2EEApplication」ノード、「default」ノード、「JDBCResource」ノードの順に開き、「接続プールの例」をクリックします。JDBCResource: "接続プールの例"ページが表示されます。

  2. 属性のリストからinitialLimit属性を見つけ、「値」フィールドに新しい値を入力します。

  3. 属性のリストからminConnections属性を見つけ、「値」フィールドに新しい値を入力します。

  4. 属性のリストからmaxConnections属性を見つけ、「値」フィールドに新しい値を入力します。

  5. 「適用」をクリックします。

クライアントからの接続プール・プロパティの追加

次のクライアント例では、JDBCResourceMBeanインタフェースを使用して、OC4Jが最初にインストールされたときにデフォルト・アプリケーションで定義された接続プール例に接続プール・プロパティを追加しています。この例では、前述のJAR以外にoc4j-internal.jarライブラリが必要です。このJARは、ORACLE_HOME/j2ee/home/lib/にあります。

package com.oracle.test;

import java.util.Hashtable;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.mbeans.JDBCResourceMBean;

public class UpdateConnectionPool {
   public UpdateConnectionPool() {
   }

   private JMXConnector connect (String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
             "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         UpdateConnectionPool amds = new UpdateConnectionPool();
         JMXConnector connection =
            amds.connect("service:jmx:rmi://host:23791", "user", "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myCP = new ObjectName(
            "oc4j:j2eeType=JDBCResource,name=\"Example
            Connection Pool\",J2EEApplication=default,J2EEServer=standalone");
         JDBCResourceMBean jrmb = MBeanServerInvocationHandler.newProxyInstance(
         mbs, myCP, JDBCResourceMBean.class, false);

         jrmb.setmaxConnections(1000);
         jrmb.setminConnections(5);
         jrmb.setinitialLimit(6);
         System.out.println("the following connection pool was updated:
            "+jrmb.getconnectionPoolName());

         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

グループ・ベースの例

この項の例では、J2EEServerGroup MBeanを使用して、同じグループに割り当てられたすべてのOC4Jインスタンスに対して属性を表示し操作を実行する方法を示しています。スタンドアロンOC4Jインスタンスとは異なり、グループ・ベースのタスクはクラスタMBeanブラウザを使用して実行します。この項に示す例は次のとおりです。

グループに含まれるJ2EEサーバーの一覧表示

この例では、J2EEServerGroup MBeanを使用して、グループに割り当てられたすべてのJ2EEサーバーのリストを取得しています。J2EEサーバーの名前は、MBeanインスタンス・オブジェクト名として返されます。

クラスタMBeanブラウザからのJ2EEサーバーの一覧表示

クラスタMBeanブラウザからグループに含まれるすべてのJ2EEサーバーを一覧表示するには、次のようにします。

  1. 「クラスタMBeanブラウザ」ページから「J2EEServerGroup」ノードを開き、操作を呼び出すグループの名前をクリックします。そのグループの「J2EEServerGroup」ページが表示されます。

  2. 属性のリストから「j2eeServers」をクリックします。「属性」ページが表示され、グループに含まれるすべてのJ2EEサーバー・インスタンスが一覧表示されます。

クライアントからのJ2EEサーバーの一覧表示

次のクライアント例では、J2EEServerGroupMBeanProxyクラスからgetj2eeServersメソッドを使用して、グループに含まれるすべてのJ2EEサーバーを一覧表示しています。

package com.oracle.test;

import java.util.Hashtable;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.farm.mbeans.proxies.J2EEServerGroupMBeanProxy;

public class ListServers {
   public ListServers() {
   }

   private JMXConnector connect(String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         ListServers ls = new ListServers();
         JMXConnector connection =
         ls.connect("service:jmx:rmi:///opmn://host:6003/cluster/", "user",
            "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myListTest = new ObjectName("
            ias:j2eeType=J2EEServerGroup,name=default_group");
         J2EEServerGroupMBeanProxy jsgmp =
            MBeanServerInvocationHandler.newProxyInstance(mbs, myListTest,
            J2EEServerGroupMBeanProxy.class, false);

         Object[] l_results = jsgmp.getj2eeServers();

         for (int i = 0; i < l_results.length; i++) {
            Object o = l_results[i];

            System.out.println(o);
         }
         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

OC4Jインスタンス・グループへのマネージド・データソースの追加

この例では、J2EEServerGroup MBeanを使用して、グループ内の各OC4JインスタンスのJ2EEApplication MBeanで操作を呼び出しています。この例は、指定したグループ内の各OC4Jインスタンスのデフォルト・アプリケーションにマネージド・データソースを追加する方法を示しています。データソースの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。

クラスタMBeanブラウザからのマネージド・データソースの追加

クラスタMBeanブラウザからグループ内のすべてのOC4Jインスタンスにマネージド・データソースを追加するには、次のようにします。

  1. 「クラスタMBeanブラウザ」ページから「J2EEServerGroup」ノードを開き、操作を呼び出すグループの名前をクリックします。そのグループの「J2EEServerGroup」ページが表示されます。

  2. 「操作」をクリックします。

  3. 操作のリストから「invoke」をクリックします。「操作: invoke」ページが表示されます。

  4. 「操作: invoke」ページから、懐中電灯アイコンをクリックします。「検索と選択: MBean」ページが表示されます。

  5. MBeanツリーのリストから、「oc4j」、「J2EEApplication」の順に開きます。

  6. defaultアプリケーションに対するMBeanインスタンスを選択します。

  7. 「選択」をクリックします。

  8. 「操作: invoke」ページから「OperationName」ドロップダウン・リストを使用して、「12. createManagedDataSource」を選択します。

  9. 「操作: invoke」ページからパラメータ編集アイコンをクリックします。パラメータの編集ページが表示されます。

  10. 提供されたフィールドを使用して、データソース・パラメータを入力します。

  11. 「OK」をクリックします。

  12. 「呼出し操作」をクリックします。

クライアントからのマネージド・データソースの追加

次のクライアント例では、グループ内の各OC4Jインスタンスでdefaultアプリケーションにマネージド・データソースを追加するために、J2EEServerGroupMBeanインタフェースからinvokeメソッドを使用して、J2EEApplicationMBeancreateManagedDataSourceメソッドを呼び出しています。この例では、前述のJAR以外にoc4j-internal.jarライブラリが必要です。このJARは、ORACLE_HOME/j2ee/home/lib/にあります。

package com.oracle.test;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.farm.mbeans.proxies.J2EEServerGroupMBeanProxy;

public class AddMDStoGroup {
   public AddMDStoGroup() {
   }

   private JMXConnector connect (String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         AddMDStoGroup amds = new AddMDStoGroup();
         JMXConnector connection = amds.connect(
            "service:jmx:rmi:///opmn://host:6003/cluster/
            ASInstanceName/Oc4jCompName", "user", "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myjsg = new ObjectName(
            "ias:j2eeType=J2EEServerGroup,name=default_group");
         J2EEServerGroupMBeanProxy jsgmb = MBeanServerInvocationHandler.
            newProxyInstance(mbs, myjsg, J2EEServerGroupMBeanProxy.class, false);

         ObjectName defaultApplication = new ObjectName(
            "oc4j:j2eeType=J2EEApplication,name=default,J2EEServer=standalone");

         Object [] params = { "MyDataSource2", "scott", "tiger",
            "jdbc/MyDataSource2", 30, "Example Connection Pool", "local", ""};

         String[] sig = {"java.lang.String", "java.lang.String",
           "java.lang.String", "java.lang.String", "java.lang.Integer",
           "java.lang.String", "java.lang.String", "java.lang.String"};

         Map results = jsgmb.invoke(defaultApplication, "createManagedDataSource",
            params, sig);

         System.out.println("The following instances were updated:");

         Iterator iterator = results.keySet().iterator();
            while (iterator.hasNext()) {
               Object var = iterator.next();
               System.out.println(var);
         }
         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

OC4Jインスタンス・グループへのユーザーのプロビジョニング

この例では、J2EEServerGroup MBeanを使用して、グループ内の各OC4JインスタンスでJ2EEApplication MBeanを呼び出しています。この例は、ユーザーを追加してoc4j-administratorsグループに割り当てる方法を示しています。

クラスタMBeanブラウザからのユーザーのプロビジョニング

クラスタMBeanブラウザを使用してグループ内のすべてのOC4Jインスタンスにわたってユーザーをプロビジョニングするには、次のようにします。

  1. 「クラスタMBeanブラウザ」ページから「J2EEServerGroup」ノードを開き、操作を呼び出すグループの名前をクリックします。そのグループの「J2EEServerGroup」ページが表示されます。

  2. 「操作」をクリックします。

  3. 操作のリストから「invoke」をクリックします。「操作: invoke」ページが表示されます。

  4. 「操作: invoke」ページから、懐中電灯アイコンをクリックします。「検索と選択: MBean」ページが表示されます。

  5. MBeanツリーのリストから、「oc4j」、「J2EEApplication」の順に開きます。

  6. defaultアプリケーションに対するMBeanインスタンスを選択します。

  7. 「選択」をクリックします。

  8. 「操作: invoke」ページから「OperationName」ドロップダウン・リストを使用して、「7. addUser」を選択します。

  9. 「操作: invoke」ページからパラメータ編集アイコンをクリックします。パラメータの編集ページが表示されます。

  10. 提供されたフィールドを使用して、ユーザー情報を入力します。

  11. 「OK」をクリックします。

  12. 「呼出し操作」をクリックします。

  13. 「操作: invoke」ページから「OperationName」ドロップダウン・リストを使用して、「9. addUserToGroup」を選択します。

  14. 「操作: invoke」ページからパラメータ編集アイコンをクリックします。パラメータの編集ページが表示されます。

  15. 提供されたフィールドを使用して、手順10で作成したユーザー名を入力し、グループ名に対してoc4j-administratorsを入力します。

  16. 「OK」をクリックします。

  17. 「呼出し操作」をクリックします。

クライアントからのユーザーのプロビジョニング

次のクライアント例では、グループ内の各OC4Jインスタンスでユーザーをdefaultアプリケーションにプロビジョニングするために、J2EEServerGroupMBeanインタフェースからinvokeメソッドを使用して、J2EEApplicationMBeanインタフェースでaddUserおよびAddUserToGroupメソッドを呼び出しています。

package com.oracle.test;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import oracle.oc4j.admin.management.farm.mbeans.proxies.J2EEServerGroupMBeanProxy;

public class ProvisionUser {
   public ProvisionUser() {
   }

   private JMXConnector connect (String URL, String username, String password) {

      JMXConnector jmxCon = null;

      try {
         Hashtable credentials = new Hashtable();
         credentials.put("login", username);
         credentials.put("password", password);

         Hashtable env = new Hashtable();
         env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "oracle.oc4j.admin.jmx.remote");
         env.put(JMXConnector.CREDENTIALS, credentials);

         JMXServiceURL serviceUrl = new JMXServiceURL(URL);
         jmxCon = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

         jmxCon.connect();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return jmxCon;
   }

   public static void main(String[] args) {

      try {
         ProvisionUser pu = new ProvisionUser();
         JMXConnector connection = pu.connect(
            "service:jmx:rmi:///opmn://host:6003/cluster/
            ASInstanceName/Oc4jCompName", "user", "password");
         MBeanServerConnection mbs = connection.getMBeanServerConnection();

         ObjectName myjsg = new ObjectName(
            "ias:j2eeType=J2EEServerGroup,name=default_group");
         J2EEServerGroupMBeanProxy jsgmb = MBeanServerInvocationHandler.
            newProxyInstance(mbs, myjsg, J2EEServerGroupMBeanProxy.class, false);

         ObjectName provision = new ObjectName(
            "oc4j:j2eeType=J2EEApplication,name=default,J2EEServer=standalone");

         Object[] params = {"joe", "password", "A nice guy"};
         String[] sig = {"java.lang.String", "java.lang.String",
            "java.lang.String"};

         jsgmb.invoke(provision, "addUser", params, sig);

         Object[] g_params = {"joe", "oc4j-administrators"};
         String[] g_sig = {"java.lang.String", "java.lang.String"};

         Map g_results = jsgmb.invoke(provision, "addUserToGroup", g_params,
            g_sig);

         System.out.println("The following instances were updated:");

         Iterator iterator = g_results.keySet().iterator();
         while (iterator.hasNext()) {
            Object var = iterator.next();
            System.out.println(var);
         }
         connection.close();

      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

アプリケーション固有のMBeanの作成

アプリケーション固有のMBeanを作成してアプリケーション内にデプロイし、アプリケーションの管理に役立てることができます。この項には、次の内容が含まれています。

アプリケーション固有のMBeanの作成

この項では、アプリケーション固有のMBeanを作成する手順を示します。J2EEアプリケーション固有のMBeanの作成手順は、JMX仕様に示されている通常のMBeanの作成手順とほとんど同じですが、いくつかの違いがあります。この項には、次の内容が含まれています。

OC4JがサポートするMBeanの種類

JMXで定義されている次の種類のMBeanはすべて、OC4Jにデプロイできます。

  • 標準MBean

    最も簡単に設計および実装できるMBeanです。ただし、存在できるのは静的な管理インタフェース内のみです。

    標準MBeanの属性と操作は、名前にMBeanという接尾辞が含まれるJavaインタフェースから抽出されます。Javaオブジェクトは、インタフェースと同じ名前(MBean接尾辞の部分は除く)のクラスにするだけで、標準MBeanにすることができます。たとえば、インタフェースManagerMBeanと同じJavaパッケージ内では、オブジェクトはクラスManagerになります。

    標準MBeanは、javax.management.StandardMBeanクラスから作成することもできます。

  • 動的MBean

    実行時に実装される動的な管理インタフェースを公開するMBeanです。公開される各属性と操作を記述するメタデータは、基本的に自己文書化インタフェースを提供する呼出し側アプリケーションで利用可能である必要があります。

    動的MBeanは、javax.management.DynamicMBeanインタフェースを実装する必要があります。

  • モデルMBean

    実行時に構成できる動的MBeanです。OC4Jの実行時管理は、このタイプのMBeanを使用して実装します。

    モデルMBeanの実装は、異なる管理インタフェースや管理対象リソースで何回でも再利用でき、永続性やキャッシングなどの共通機能を利用できます。

    モデルMBeanは、javax.management.modelmbean.ModelMBeanインタフェースによって定義されます。モデルMBeanは、javax.management.modelmbean.RequiredModelMBeanクラスのオブジェクトとして実装する必要があります。

  • オープンMBean

    追加のJARファイルをデプロイしなくても、実行時にクライアントが検出して使用できる、もう1つのタイプの動的MBeanです。オープンMBeanは、Java以外のプログラムなど、アプリケーション固有の型にアクセスできないリモート管理プログラムで役に立ちます。

    オープンMBeanは、javax.management.openmbeanパッケージで定義されます。

orion-application.xmlで定義されているMBeanなどのように、デプロイ時またはアプリケーションの起動時に登録されるMBean実装クラスは、引数のないコンストラクタを含む必要があります。ガイドラインについては「OC4J MBeanServerへのMBeanの登録」を参照してください。アプリケーションがMBeanを作成して登録する場合は、このような要件はありません。

oracle.j2ee.admin.jmxパッケージでは、ローカライゼーションのサポートなど、MBeanクラスへの実装を検討できるJMXの状態管理機能が提供されています。詳細は、「MBeanへのローカライゼーション・サポートの追加」を参照してください。

JMX MBeanServerおよびMBeanServerConnectionインタフェースのサポートされていないメソッド

次の操作から取得したMBeanServerオブジェクトを使用する場合、JMX MBeanServerインタフェースの多くのメソッドはJ2EEアプリケーションで使用できません。

MBeanServer mbsrv = MBeanServerFactory.newMBeanServer();

返されたMBeanServerオブジェクトで次のメソッドのいずれかを使用すると、UnsupportedOperationException例外がスローされます。

public final ClassLoader getClassLoaderFor(ObjectName mbeanName)

public final ClassLoader getClassLoader(ObjectName loaderName)

public final ClassLoaderRepository getClassLoaderRepository()

public final Object instantiate(String className)

public final Object instantiate(String className, ObjectName loaderName)

public final Object instantiate(String className, Object[] params, String[] signature)

public final Object instantiate(String className, ObjectName loaderName, Object[] params, String[] signature)

public final ObjectInstance createMBean(String className, ObjectName name)

public final ObjectInstance createMBean(String className, ObjectName name, 
ObjectName loaderName)

public final ObjectInstance createMBean(String className, ObjectName name, 
Object[] params, String[] signature)

public final ObjectInstance createMBean(String className, ObjectName name, ObjectName loader, 
Object[] params, String[] signature)

public final ObjectInputStream deserialize(ObjectName name, byte[] data)

public final ObjectInputStream deserialize(String className, byte[] data)

public final ObjectInputStream deserialize(String className, ObjectName loaderName, byte[] data)

アプリケーションがOracle JMXコネクタを使用する場合、MBeanServerConnectionインタフェースの多くのメソッドはサポートされません。作成されたMBeanServerConnectionオブジェクトで次のメソッドのいずれかを使用すると、UnsupportedOperationException例外がスローされます。

public final ObjectInstance createMBean(String className, ObjectName name)

public final ObjectInstance createMBean(String className, ObjectName name, 
ObjectName loaderName)

public final ObjectInstance createMBean(String className, ObjectName name, 
Object[] params, String[] signature)

public final ObjectInstance createMBean(String className, ObjectName name, 
ObjectName loader, Object[] params, String[] signature)

アプリケーションがJMX MBeanServerまたはMBeanServerConnectionインタフェースを使用する場合、サポートされていないメソッドをアプリケーションで使用しないでください。

MBeanのサンプル

次に示すのは、MBeanの実装の簡単な例です。このMBeanには、一緒にパッケージされているアプリケーション内のユーザーを有効または無効にする操作が含まれます。

UserManagerMBeanインタフェース

これはMBeanに対するJavaインタフェースです。

package demo.servicereq.management;

public interface UserManagerMBean {
  String[] listUsers();
  void enableUser(int userId);
  void disableUser(int userId);
}

UserManager実装クラス

これはMBean実装クラスです。

package demo.servicereq.management;

import oracle.srdemo.data.User;
import oracle.srdemo.data.UserAccess;
import java.util.Collection;
import java.util.logging.Level;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import java.util.logging.Logger;
import java.util.Iterator;

public class UserManager
       extends NotificationBroadcasterSupport
       implements UserManagerMBean {

 private static final String m_classname =
 UserManager.class.getClass().getName();

 public static final String ENABLE_USER = "enableUser";
 public static final String DISABLE_USER = "disableUser";
 public static final String LIST_USERS = "listUsers";
 String[] m_users;

  // A logger
  private static final Logger m_logger = Logger.getLogger(m_classname);



 /**   * Constructor.
   */
  public UserManager()  {
  }

  /**
   * Lists all the user names.
   * @return
   */
  public String[] listUsers() {
    m_logger.entering(m_classname,"listUsers");
    // query all users and return
    m_logger.exiting(m_classname,"listUsers");
    return m_users;
  }

/**   * Sets the specified user to a state of enabled.
   * @param userId
   */
  public void enableUser(int userId) {
    m_logger.entering(m_classname,"enableUser");
    sendNotification(ENABLE_USER, "userId [" + userId + "] now enabled");
    // Lookup user with userId.
    // Set the status of the user to enabled.
    // throw exception if user doesn't exist.
    m_logger.exiting(m_classname,"enableUser");
  }

/**
   * Sets the specified user to a state of disabled.
   * @param userId
   */
  public void disableUser(int userId) {
    m_logger.entering(m_classname,"disableUser");
    sendNotification(DISABLE_USER, "userId [" + userId + "] now disabled");
    // Lookup user with userId.
    // Set the status of the user to disabled.
    // throw exception if user doesn't exist.
    m_logger.exiting(m_classname,"disableUser");
  }

/**
    * Informs any interested party on what notifications this MBean emits.
    * @return the notifications this MBean emits
    */
  public MBeanNotificationInfo[] getNotificationInfo() {
    m_logger.entering(m_classname,"getNotificationInfo");
    String NOTIFICATIONS[] =
    { ENABLE_USER, DISABLE_USER };
    MBeanNotificationInfo[] info =
    {       new MBeanNotificationInfo(NOTIFICATIONS,
                                "javax.management.Notification",
                                "Notification set for UserManager") };
    m_logger.exiting(m_classname,"getNotificationInfo");
    return info;  }

 /**
   * Sends a JMX notification using the sendNotification method
   * from the base class.
   * @param operation - the name of the operation sending the notification.
   * @param desc - the description to place within the notification.
   * @return void
   */
  public void sendNotification(String operation, String desc) {
    m_logger.entering(m_classname,"sendNotification");
    Notification notification = new Notification(operation,this,
    System.currentTimeMillis(), desc);
    super.sendNotification(notification);
    m_logger.exiting(m_classname,"sendNotification");
  }

}

MBeanのデプロイ用のパッケージング

MBeanは、管理対象のアプリケーションとともにパッケージされます。JARファイルにMBeanクラスをパッケージし、アプリケーションのEARファイル構造のルート・レベルにJARファイルを追加します。この項には、次の内容が含まれています。

orion-application.xmlでのMBeanの定義

orion-application.xmlで定義することにより、デプロイ時にMBeanを登録するために必要な構成データを提供できます。orion-application.xmlは、J2EE標準のapplication.xmlディスクリプタに対するOC4J固有の拡張です。これらのディスクリプタはどちらも、親アプリケーションのEARファイル内にMBeanとともにパッケージされます。

orion-application.xmlで定義されているMBeanは、デプロイ時またはアプリケーションの起動時に、OC4J MBeanServerに自動的に登録されます。アプリケーションがアンデプロイされると、それに属しているMBeanもアンデプロイされます。

EARに含まれるMBeanを登録するには、次のXML要素をこのディスクリプタに追加します。

  • MBeanクラスを含むJARファイルを指し示す<library>要素または<library-directory>要素。次に示すように、path属性にJARファイル名を設定します。

    <library path="MyMBeans.jar"/>
    
  • アプリケーションに含まれる各MBeanクラスに対する固有の<jmx-mbean>要素。この要素は、MBeanブラウザ・ユーザー・インタフェースでの表示名を指定するために使用できる<description>サブ要素を持っています。各要素により、MBeanクラスがMBeanServerに登録されます。

    <jmx-mbean>要素には次の属性が含まれます。

    • objectname: その下にMBeanを登録する名前。名前のドメイン部分は、指定しても無視されます。アプリケーションのMBeanは、ドメイン名としてアプリケーションのデプロイ名を使用して登録されます。

      たとえば、MyMBeanAという名前のMBeanをwidgetという名前のアプリケーションとともにデプロイする場合は、この属性の値として:name=MyMBeanAと指定します。この場合、名前はwidget:name=MyMBeanAと表示されます。

      MBean名には、Servlet、Application、DisplayControllerなどの論理MBeanタイプを示すtypeプロパティを含める必要があります。

    • class: MBeanの実装クラス。

    <jmx-mbean>要素は、オプションとして次のサブ要素を取ります。

    • <description>サブ要素は、判読可能な名前を含みます。この名前は、MBeanブラウザのユーザー・インタフェースに表示されます。

    • 1つ以上の<attribute>要素。それぞれが、MBeanの属性に設定する初期値を定義します。詳細は、「MBeanの属性の初期化」を参照してください。

    次の例では、親アプリケーションのEARファイルにパッケージされるorion-application.xmlデプロイメント・ディスクリプタ内で、2つのアプリケーション固有MBeanを定義しています。

    <orion-application>
      ...
      <jmx-mbean objectname=":type=Application,name=MyMBeanA"
        class="my.mbeans:MBeanTypeA">
        <description>My First MBean</description>
      </jmx-mbean>
      <jmx-mbean objectname=":type=Application,name=MyMBeanB"
        class="my.mbeans:MBeanTypeB">
        <description>My Second MBean</description>
      </jmx-mbean>
    </orion-application>
    

MBeanの属性の初期化

MBeanとともにパッケージされるorion-application.xmlディスクリプタで1つ以上の属性に対して初期値を設定することで、MBeanを事前に構成することができます。MBeanの属性は、インスタンス化のときにこれらの値で初期化されます。

属性の値は、次のいずれかの型で事前に構成する必要があります。

  • 基本型(int、long、Integer、Booleanなど)

  • 文字列コンストラクタ(現在のリリースでは、この値は、MBeanのオブジェクト名を表すjavax.management.ObjectName値である必要があります)

  • サポートされている型の1次元配列

各属性とその値は、orion-application.xml内でMBeanを定義している<jmx-mbean>要素内の<attribute>要素で指定します。実際の値は<value>サブ要素で指定します。同じ属性に対して設定する文字列値を含む複数の<value>サブ要素を、<values>要素内にラップすることができます。

次の例は、サポートされる値の型を<jmx-mbean>要素で設定する方法を示しています。

<orion-application>
  ...
  <jmx-mbean objectname=":type=Application,name=MyMBeanA"
     class="my.mbeans:MBeanTypeA">
    <description>My First MBean</description>
    <attribute name="attr1">
      <value>true</value>
    </attribute>
    <attribute name="attr2">
      <value>100</value>
    </attribute>
    <!-- An array of strings -->
    <attribute name="attr3">
      <value>Test string 1</value>
      <value>Test string 2</value>
      <value>Test string 3</value>
    </attribute>
    <!-- A javax.management.ObjectName representing the name of an MBean -->
    <attribute name="attr3">
     <value>MyApp:Type=Administration</value>
    </attribute>
  </jmx-mbean>
</orion-application>

OC4J MBeanServerへのMBeanの登録

アプリケーションとともにデプロイしたMBeanは、MBeanServerに登録する必要があります。登録したMBeanは、Application Server ControlのシステムMBeanブラウザ・コンポーネントを通して、完全に管理できます。

MBeanの登録には、3つのオプションがあります。

  • アプリケーションのEARファイルにMBeanとともにパッケージされるorion-application.xmlディスクリプタでMBeanを定義します。

  • デプロイ時のアプリケーションのデプロイ・プランでMBeanを定義します。

  • アプリケーションのコード内からMBeanをプログラム的に登録します。

    実装のガイドラインについては、「アプリケーション・コードでのプログラム的なMBeanの登録」を参照してください。

次のトピックでは、これらのオプションについて説明します。

アプリケーション・ディスクリプタでのMBeanの定義

デプロイ時にMBeanを自動的に登録する最も直接的なメカニズムは、アプリケーションEARファイル内のMBeanに含まれているorion-application.xmlディスクリプタにMBeanを定義することです。詳細は、「orion-application.xmlでのMBeanの定義」を参照してください。


注意:

MBeanはグローバルなdefaultアプリケーションに登録することができます。このようにすると、OC4Jインスタンスにデプロイされる他のすべてのアプリケーションから、そのMBeanが参照できます。

OC4J固有のapplication.xmlファイルに<jmx-mbean>要素を追加することで、MBeanがdefaultアプリケーションに登録されます。このファイルは、デフォルトではORACLE_HOME/j2ee/instance/configディレクトリにあります。

application.xmlファイルとorion-application.xmlファイルの形式は、同じXMLスキーマで定義されています。<jmx-mbean>要素の詳細は、「orion-application.xmlでのMBeanの定義」を参照してください。


デプロイ・プランでのMBeanの定義

MBeanはアプリケーションのデプロイ・プランに定義することができます。デプロイ・プランでは、orion-application.xmlを含む複数のデプロイメント・ディスクリプタに分散しているOC4J固有のすべての構成データがまとめられます。デプロイ・プランのデータ・セットは、OC4J内のアプリケーションに対して作成されるorion-application.xmlディスクリプタに保持されます。

デプロイ・プランは、Application Server ControlおよびOracle JDeveloper 10gで提供されているデプロイ・プラン編集機能を使用して、デプロイ時に作成または編集できます。デプロイ・プランの作成と使用に関する詳細なガイドラインについては、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

アプリケーション・コードでのプログラム的なMBeanの登録

アプリケーションのコード内からMBeanを動的に登録できます。MBeanをプログラムで登録すると、MBeanはそれを含むアプリケーションのライフ・サイクルにバインドされます。つまり、アプリケーションがアンデプロイされると、そのすべてのMBeanが、MBeanServerから自動的に登録解除されます。

MBeanを登録するアプリケーションには、javax.managementパッケージをインポートする必要があります。このパッケージは、OC4J MBeanServerにアクセスするために必要なクラスを含む、JMXのコア・クラスを提供します。MBeanの実装クラスも、アプリケーションから利用できる必要があります。

次のコード・スニペットで示されているように、アプリケーションは、javax.management.MBeanServerFactoryを介して参照を作成することで、OC4J MBeanServerにアクセスします。

MBeanServer mbsvr = MBeanServerFactory.newMBeanServer();

次の制限に注意してください。

  • MBeanは、アプリケーションがデプロイされたネームスペースであるドメインのObjectNameに登録する必要があります。これにより、BeanはOC4J内の独自のネームスペースに存在するようになります。特定のアプリケーションに対する正しいドメインを返すには、MBeanServerオブジェクトでgetDefaultDomain()メソッドを呼び出します。

  • アプリケーションでは、アプリケーションに属しているMBeanの属性のみを設定でき、そのMBeanのメソッドのみを呼び出すことができます。実際には、あるアプリケーションに属しているMBeanは、他のアプリケーションからは見えません。

次に示すコード・スニペットでは、OC4J MBeanServerにMBeanを登録しています。MBeanは、oracle.oc4j.admin.jmx.server.mbeans.Testerクラスのオブジェクトです。

try
  {
    // Get a reference to the MBeanServer
    MBeanServer _mbeanServer = MBeanServerFactory.newMBeanServer();

      // Create the MBean instance
      Tester bean = new Tester();

      //Construct the MBean name using the default application's domain name
      ObjectName beanName= new ObjectName(mbsrv.getDefaultDomain()+
                                          ":type=Tester,name=MyMBean");

    // Register the MBean with the MBeanServer
    mbsrv.registerMBean(bean, beanName);
  }  catch(Exception e)
  {
    // Handle exceptions; for simplicity, dump the stack trace to show any
    // errors that occur
    e.printStackTrace();
  }

次に示すサーブレットUserMBeanServletの例では、init()メソッド内でOC4J MBeanServerにMBeanを登録します。

package web;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import javax.management.*;

import oracle.oc4j.admin.jmx.server.mbeans.Tester;

public class UserMBeanServlet extends HttpServlet {

public void init() throws ServletException {
  try {
      // Get a reference to the MBeanServer
      MBeanServer mbsrv = MBeanServerFactory.newMBeanServer();

      // Create the MBean instance
      Tester bean = new Tester();

      //Construct the MBean name using the application's domain name
      ObjectName beanName= new ObjectName(mbsrv.getDefaultDomain()+
                               ":type=Tester,userprop1=bean,userprop2=beanProp2");

    // Register the MBean with the MBeanServer
    mbsrv.registerMBean(bean, beanName);

    // Print a success message to the console
    System.out.println("Finished registering" +beanName);

    }
catch(Exception e) {
// Dump the stack trace to show any errors that occur
e.printStackTrace();
    }
  }
//Standard servlet code for handling requests
...
}

MBeanへのローカライゼーション・サポートの追加

モデルMBeanとオープンMBeanを含むすべての動的なMBeanでは、MBeanのみでなくそれが公開する属性と操作を記述するメタデータを提供する必要があります。世界的に販売されるアプリケーションの場合は、このメタデータのローカライゼーションをサポートするようにMBeanを設計する必要があります。

リソース・バンドルでのローカライゼーションに関する他の情報については、Sun社の次の記事を参照してください。

http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/

Oracleが提供するローカライゼーション・サポート

oracle.j2ee.admin.jmx APIは、MBeanのローカライズに固有の機能でJMXの仕様を拡張します。このAPIを使用するMBeanはOC4Jに固有のものとして使用する必要があり、他のJ2EEコンテナには移植できないことに注意してください。

次の各項では、ローカライズ固有のインタフェースおよびクラスを説明します。

JMXState

oracle.j2ee.admin.jmx.JMXStateインタフェースでは、JMXの操作に関連する状態、特に使用するLocaleインスタンスの状態が定義されています。この状態をMBeanの実装で取得し、ローカライゼーションをサポートすることができます。

このインタフェースに含まれるメソッドは次の1つで、このメソッドはLocaleインスタンスを返します。

public Locale getLocale()

JMXStateFactory

oracle.j2ee.admin.jmx.JMXStateFactoryクラスでは、使用するLocaleオブジェクトなど、JMXの操作に関連する状態にアクセスできます。次のメソッドが含まれます。

  • public static JMXState getJMXState()

    呼び出したJMX MBean操作に関連するJMXの状態を含むoracle.j2ee.admin.jmx.JMXStateインスタンスを取得します。このメソッドは、MBeanの実装の内部からのみ呼び出す必要があります。

MBeanメタデータをローカライズするためのリソース・バンドルの使用

ローカライゼーションは、java.util.ResourceBundleクラスのオブジェクトであるリソース・バンドルを使用して有効化します。リソース・バンドルは、キー/値ペアを含む1つ以上のJavaクラスまたはJavaのpropertiesファイルで構成されます。値は、説明的なテキストからなる文字列です。リソース・バンドルは、通常、サポートされる言語ごとに存在します。

次に示すのはデフォルトのOC4JのMessages.propertiesファイルのスニペットで、サンプルのUserManager MBeanに対するメタデータがキー/値ペアとして格納されていることがわかります。キーは、後述のコード・サンプルにおける値セットに対応します。

//Description of the MBean
usermanager_description=Manages users of the corresponding installation.

//Attribute description strings
This MBean does not have attributes.


//Operation description strings
usermanager_listUsers=List current user IDs.
usermanager_enableUser=Enables the specified user account.
usermanager_disableUser=Disables the specified user account.

//Operation parameter description strings
usermanager_userId=The user account to affect.

リソース・バンドルの実装の詳細は、次のURLの「Localization with Resource Bundles」を参照してください。

http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/

注意:

OC4Jでは、Javaクラスを使用して、オラクル社が提供するMBeanを含む独自のコンポーネントのメタデータをローカライズします。OC4Jで使用するデフォルトのMessages.propertiesファイルは変更しないでください。このファイルを変更しても、新しいバージョンのOC4Jがインストールされると、変更内容は常に上書きされます。

MBeanへのローカライゼーション・サポートの追加

メタデータを公開するには、オーバーロードしたgetMBeanInfo()メソッドをMBeanで実装する必要があります。このメソッドは、MBeanによって公開される属性と操作に対する汎用メタデータが移入されたjavax.management.MBeanInfoオブジェクトを返します。

動的MBeanでは、JMXクライアントのLocaleオブジェクトを使用してメタデータの取得とローカライズを行うために、このメソッドの汎用バージョンを実装する必要があります。javax.management.modelmbean.RequiredModelMBeanクラスのオブジェクトであるモデルMBeanの実装にも、この汎用シグネチャを実装する必要があります。詳細は、「汎用getMBeanInfo()シグネチャの実装」を参照してください。

ローカライゼーションをサポートするMBeanでは、シグネチャgetMBeanInfo(Locale locale)も公開する必要があります。このシグネチャにより、OC4J MBeanServerによって渡されるLocaleに基づいてメタデータを取得し、ローカライズします。「必要なgetMBeanInfo(Locale locale)シグネチャの公開」を参照してください。

汎用getMBeanInfo()シグネチャの実装

返されたメタデータをローカライズするには、汎用getMBeanInfo()メソッドがJMXクライアントのLocaleオブジェクトにアクセスする必要があります。oracle.j2ee.admin.jmx.JMXStateインタフェースのgetLocale()メソッドを使用して、これを実現できます。Beanでは、使用するLocaleオブジェクトなど、JMXの操作に関連する状態へのアクセスを提供するoracle.oc4j.admin.jmx.JMXStateFactoryクラスもインポートする必要があります。

次に示すのは、簡単なMBeanでのこのメソッドの実装の例です。

package demo.servicereq.management;


import oracle.srdemo.data.User;
import oracle.srdemo.data.UserAccess;
import java.util.Collection;
import java.util.logging.Level;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import java.util.logging.Logger;
import java.util.Iterator;

// Import packages needed for localization of MBean metadata
import java.util.Locale;
import java.util.ResourceBundle;
import javax.management.MBeanInfo;


// Import the Oracle localization APIs
import oracle.j2ee.admin.jmx.JMXStateFactory;
import oracle.j2ee.admin.jmx.JMXState;

public class UserManager
       extends NotificationBroadcasterSupport
       implements UserManagerMBean {

// Create the MBeanInfo object to allow attributes and operations exposed by the
// MBean to be retrieved
public MBeanInfo getMBeanInfo()
  {
    // Get access to the Locale instance set by the JMX client
    Locale locale = JMXStateFactory.getJMXState().getLocale();

    // Create MBean's localized meta-data using the locale from JMX client
    return createMBeanInfo(locale);
  }

必要なgetMBeanInfo(Locale locale)シグネチャの公開

タイプに関係なく、OC4JにデプロイされるすべてのMBeanは、getMBeanInfo(Locale locale)シグネチャを公開する必要があります。これは、パラメータとして渡されるLocaleオブジェクトに基づいてMBeanのメタデータを取得し、ローカライズします。このメソッドは、Application Server ControlのシステムMBeanブラウザ・コンポーネントやOracle JSR-160コネクタなどのクライアントによって呼び出され、MBeanのリモート管理に使用されます。

このメソッドを使用すると、デフォルトのgetMBeanInfo()メソッドに対し、Oracle固有のJMXStateクラスの導入などの変更を行わなくても、ローカライズされたMBeanInfoをサポートできます。結果として、移植性のあるローカライズされたコードを記述できますが、適切なローカライゼーションはOracle Application Serverでのみ機能します。

次に示すのは、動的MBeanにおけるgetMBeanInfo()の両方のシグネチャの実装例です。

package demo.servicereq.management;

import oracle.srdemo.data.User;
import oracle.srdemo.data.UserAccess;
import java.util.Collection;
import java.util.logging.Level;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import java.util.logging.Logger;
import java.util.Iterator;

// Import the Oracle localization APIs
import oracle.j2ee.admin.jmx.JMXStateFactory;
import oracle.j2ee.admin.jmx.JMXState;

public class UserManager
       extends NotificationBroadcasterSupport
       implements UserManagerMBean {

// Create the MBeanInfo object to allow attributes and operations exposed by the
// MBean to be retrieved
public MBeanInfo getMBeanInfo()
{
  // Get access to the Locale instance set by the JMX client
  Locale locale = JMXStateFactory.getJMXState().getLocale();

  // Create MBean's localized metadata using the Locale set by the JMX client
  return createMBeanInfo(locale);
}

// Expose the Dynamic MBean operation
public MBeanInfo getMBeanInfo(Locale locale)
{
  // Create MBean's metadata using the Locale from the MBeanServer
  return createMBeanInfo(locale);
}

この例では、getMBeanInfo()の両方のシグネチャが、プライベートなcreateMBeanInfo(Locale locale)メソッドにLocaleインスタンスを渡します。このメソッドは、MBeanおよびその属性と操作の記述を含む適切なリソース・バンドルを取得します。このメソッドは、操作の各パラメータに対しても、ローカライズされた記述を設定することに注意してください。その後、ローカライズされたメタデータを含むMBeanInfoオブジェクトを作成します。

package demo.servicereq.management;

import java.util.Locale;

import java.util.ResourceBundle;

import javax.management.MBeanConstructorInfo;
import javax.management.MBeanInfo;

import javax.management.MBeanOperationInfo;

import javax.management.MBeanParameterInfo;

import oracle.srdemo.data.User;
import oracle.srdemo.data.UserAccess;
import java.util.Collection;
import java.util.logging.Level;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import java.util.logging.Logger;
import java.util.Iterator;

// Import the Oracle localization APIs
import oracle.j2ee.admin.jmx.JMXStateFactory;
import oracle.j2ee.admin.jmx.JMXState;

public class UserManager
       extends NotificationBroadcasterSupport
       implements UserManagerMBean {

        private static final String m_classname =
 UserManager.class.getClass().getName();

 public static final String ENABLE_USER = "enableUser";
 public static final String DISABLE_USER = "disableUser";
 public static final String LIST_USERS = "listUsers";

  String[] m_users;

  // A logger
  private static final Logger m_logger = Logger.getLogger(m_classname);

 /**
   * Constructor.
   */
     public UserManager()  {
  }
 /**
   * Lists all the user names.
   * @return
   */
  public String[] listUsers() {
    m_logger.entering(m_classname,"listUsers");
    // query all users and return
    m_logger.exiting(m_classname,"listUsers");
    return m_users;
  }

/**
   * Sets the specified user to a state of enabled.
   * @param userId
   */
  public void enableUser(int userId) {
    m_logger.entering(m_classname,"enableUser");
    sendNotification(ENABLE_USER, "userId [" + userId + "] now enabled");

    // Lookup user with userId.
    // Set the status of the user to enabled.
    // throw exception if user doesn't exist.
    m_logger.exiting(m_classname,"enableUser");
  }

/**
   * Sets the specified user to a state of disabled.
   * @param userId
   */
  public void disableUser(int userId) {
    m_logger.entering(m_classname,"disableUser");
    sendNotification(DISABLE_USER, "userId [" + userId + "] now disabled");
    // Lookup user with userId.
    // Set the status of the user to enabled.
    // throw exception if user doesn't exist.
    m_logger.exiting(m_classname,"disableUser");
  }

/**
    * Informs any interested party on what notifications this MBean emits.
    * @return the notifications this MBean emits
    */
  public MBeanNotificationInfo[] getNotificationInfo() {
    m_logger.entering(m_classname,"getNotificationInfo");
    String NOTIFICATIONS[] =
    { ENABLE_USER, DISABLE_USER };
    MBeanNotificationInfo[] info =
    {
      new MBeanNotificationInfo(NOTIFICATIONS,
                                "javax.management.Notification",
                                "Notification set for UserManager") };
    m_logger.exiting(m_classname,"getNotificationInfo");
    return info;
  }

 /**
   * Sends a JMX notification using the sendNotification method
   * from the base class.
   * @param operation - the name of the operation sending the notification.
   * @param desc - the description to place within the notification.
   * @return void
   */
  public void sendNotification(String operation, String desc) {
    m_logger.entering(m_classname,"sendNotification");
    Notification notification = new Notification(operation,this,
    System.currentTimeMillis(), desc);
    super.sendNotification(notification);
    m_logger.exiting(m_classname,"sendNotification");
  }

// Create the MBeanInfo object to allow attributes and operations exposed by the
// MBean to be retrieved
public MBeanInfo getMBeanInfo()
{
  // Get access to the Locale instance set by the JMX client
    Locale locale;
    locale = JMXStateFactory.getJMXState().getLocale();

    // Create MBean's localized metadata using the Locale from JMX client
  return createMBeanInfo(locale);
}

// Create the MBeanInfo object to allow attributes and operations exposed by the
// MBean to be retrieved
public MBeanInfo getMBeanInfo(Locale locale)
{
  // Create the MBean's metadata using the Locale from the MBeanServer
  return createMBeanInfo(locale);
}

// Create the MBean's localized metadata
private MBeanInfo createMBeanInfo(Locale locale)
{  // Get the resource bundle for the specified locale
  ResourceBundle resource =
    ResourceBundle.getBundle("mymbeans/Messages", locale);

  MBeanInfo minfo = null;
  try
   {

   // Set the MBean constructor descriptor
      consInfoArray_ = new MBeanConstructorInfo[0];

   // Set the MBean operations descriptor

   MBeanOperationInfo[] operInfoArray_ = new MBeanOperationInfo[]{ };
      MBeanParameterInfo params;
      params = new MBeanParameterInfo[];

      // Set the description for the userId parameter
      params[0] = new MBeanParameterInfo("userId",
                 resource.getString("usermanager_userId"));

      // Set the description for the listUsers operation
      operInfoArray_[0] = new MBeanOperationInfo("listUsers",
                          resource.getString("usermanager_listUsers"),
                                                 params,
                                                 "",
                                                 MBeanOperationInfo.ACTION)

      // Set the description for the enableUser operation
      operInfoArray_[1] = new MBeanOperationInfo("enableUser",
                          resource.getString("usermanager_enableUser"),
                                                 params,
                                                 "",
                                                 MBeanOperationInfo.ACTION)

      // Set the description for the disableUser operation
      operInfoArray_[2] = new MBeanOperationInfo("disableUser",
                          resource.getString("usermanager_disableUser"),
                                                 params,
                                                 "",
                                                 MBeanOperationInfo.ACTION)

   // Create the MBeanInfo object containing the localized metadata
   // The null parameter is for notifications, which are not provided by this
   // MBean
   MBeanInfo minfo = new MBeanInfo("MyManager",
                            resource.getString("mymanager_description"),
                            attribInfoArray_,
                            consInfoArray_,
                            operInfoArray_,
                            null);
   }
   catch
   {
   // Handle exceptions
  }
return minfo;
}