カスタム MBean による WebSphere Application Server 管理システムの拡張

WebSphere プロセスのいずれか 1 つに新規の Java™ Management Extensions (JMX) MBean (詳しくは JMX 1.x 仕様を参照) を提供および登録することにより、WebSphere® Application Server 管理システムを拡張することができます。

このタスクについて

JMX MBean は、論理の特定部分の管理インターフェースを表します。 製品の標準のインフラストラクチャー内にあるすべての管理対象リソースは、JMX MBean として表されます。 さまざまな方法で、独自の MBean を作成し、その MBean を任意の WebSphere プロセスで稼働している JMX MBeanServer に登録することができます。 詳しくは、MBean Java アプリケーション・プログラミング・インターフェース (API) に関する文書を参照してください。このインフォメーション・センターでは、「参照」 > 「Mbean インターフェース (Mbean interfaces)」をクリックします。

手順

  1. カスタム JMX MBean を作成します。

    MBean を作成して製品管理システムを拡張する際には、いくつかの選択肢があります。 別のアプリケーションの既存の JMX MBean のいずれかを使用することが可能です。 製品のプロセスに、WebSphere Application Server 環境の外部にある JMX MBean サーバーでテストした任意の MBean を登録することができます。このような MBean には、標準 MBean、動的 MBean、オープン MBean、モデル MBean などがあります。

    既存の JMX MBean、および製品環境の外部で作成およびテストされた MBean だけでなく、WebSphere によって提供される特別の分散拡張機能を使用して、WebSphere ExtensionMBean プロバイダーを作成できます。この代替方法により、製品管理システムのすべての分散機能とのより優れた統合が実現されます。ExtensionMBean プロバイダーは、製品に同梱の DTD に基づいた MBean 記述子を含んだ XML ファイルの提供を意味します。 このディスクリプターは、MBean がサポートするすべての属性、操作、および通知を WebSphere システムに知らせます。 この情報を使用して、WebSphere システムは、リモート要求を MBean へ経路指定し、リモート・リスナーが MBean のイベント通知を受信するように登録できます。

    すべての内部 WebSphere MBean は、モデル MBean パターンに従います。Pure Java クラスは、管理機能に実際の論理を提供し、WebSphere MBeanFactory クラスは、XML MBean ディスクリプターからこれらの機能の記述を読み取り、このディスクリプターと一致する ModelMBean のインスタンスを作成します。 この ModelMBean インスタンスは、Java クラスにバインドされ、ユーザーのクラスと同じプロセスで稼働中の MBeanServer に登録されます。 これで、Java コードは、WebSphere Application Server 管理クライアントを表すために作成および登録された ModelMBean を介して、その管理クライアントから呼び出し可能になります。

    [z/OS]WebSphere Application Server 分散プラットフォームおよびWebSphere Application Server for z/OS® プラットフォームの両方で実行されるユーザー MBean は、z/OS マルチプロセス・モデルで正しく機能するための特殊なコーディングが必要になる場合があります。各アプリケーション・サーバーが単一の Java 仮想マシン (JVM) で実行される分散プラットフォームでは、MBean サーバーは 1 つだけです。MBean サーバーは、そのアプリケーション・サーバー内に登録されたすべての MBean を制御します。z/OS プラットフォームでは、制御プロセスと統合サーバント・プロセスが存在し、それぞれ独自の MBean サーバーを持ちます。制御プロセスは、自らの MBean プロキシー・サーバーを持ち、サーバント・プロセス間に要求を分散します。JMX MBean マルチプロセス・モデルの要求フローの詳細な説明を参照してください。

  2. オプションで、明示的な MBean セキュリティー・ポリシーを定義します。

    MBean セキュリティー・ポリシーを定義しない場合、製品はデフォルトのセキュリティー・ポリシーを使用します。

  3. 新規の MBean を登録します。 MBean の登録には、さまざまな方法があります。

    MBean は、WebSphere Application Server 管理サービスに登録できます。

    MBean は、WebSphere Application Server プロセス内の MBeanServer に登録できます。 使用可能なオプションを以下に優先順にリストします。
    • MBeanFactory クラスを使用します。 WebSphere Application Server システムとの最大限の統合を望む場合は、MBeanFactory クラスを使用して、MBeanFactory クラスの activateMBean メソッドおよび deactivateMBean メソッドによる MBean のライフサイクル管理を行います。 RuntimeCollaborator 抽象スーパークラスのサブクラス、および XML MBean ディスクリプター・ファイルを提供することにより、これらのメソッドを使用します。 この方法を使用する場合は、MBean ディスクリプターで定義された管理インターフェースを実装する Pure Java クラスを提供します。MBeanFactory クラスは、実際の ModelMBean を作成し、ユーザーに代わってそれを製品管理システムに登録します。

      モデル MBeans を登録する場合は、このオプションが推奨されます。

    • JMXManageable および CustomService インターフェースを使用します。 CustomService インターフェースを実装すると、JMXManageable インターフェースも実装されます。これにより、WebSphere 管理との統合プロセスがより容易になります。 この方法を使用することにより、RuntimeCollaborator を提供する必要がなくなります。 CustomService インターフェースが初期化されると、WebSphere MBeanFactory クラスは、XML MBean ディスクリプター・ファイルを読み取り、MBean を自動的に作成、バインドして、CustomService インターフェースに登録します。 CustomService の shutdown メソッドを呼び出すと、製品システムは、MBean を自動的に非アクティブにします。
    • AdminService インターフェースを使用します。 AdminService インターフェース上で registerMBean() メソッドを呼び出すことができ、その呼び出しは、適切なセキュリティー検査の後、そのプロセスの基礎となっている MBeanServer へ委任されます。 AdminServiceFactory クラスの getAdminService() メソッドを使用して、AdminService への参照を取得できます。

      標準、動的、およびオープン MBeans を登録する場合は、このオプションが推奨されます。 UserCollaborator クラスを実装して、MBean を使用し、分散プラットフォームおよび z/OS プラットフォームでこれらに対して一貫したサポート・レベルを提供します。

      [z/OS]z/OS プラットフォームの場合、AdminService インターフェース上の registerMBean() メソッドを介して登録された MBean は、サーバーの外側からは可視ではなく、登録されたサーバント・プロセス内からのみ呼び出すことができます。

    • MBeanServer インスタンスを直接取得します。 MBeanFactory クラスの getMBeanServer() メソッドを呼び出すことにより、製品プロセス内で稼働中の JMX MBeanServer インスタンスへの直接参照を取得することができます。 AdminService インターフェースの getMBeanFactory() メソッドを呼び出すことで、MBeanFactory クラスへの参照を取得します。

      カスタム MBean を MBean サーバーに直接登録する場合、MBean オブジェクト名は、デフォルトで、セル、ノード、およびプロセス名の鍵で拡張されます。この登録により、MBean は、管理システムの分散機能に組み込まれます。 com.ibm.websphere.mbeans.disableRouting カスタム・プロパティーを設定して、デフォルトの動作をオフにできます。

      com.ibm.websphere.mbeans.disableRouting カスタム・プロパティーの設定方法と使用方法について詳しくは、『管理サービスのカスタム・プロパティー』を参照してください。

タスクの結果

MBean の作成および登録方法に関係なく、新規の MBean コード用に、適正な Java 2 セキュリティー権限をセットアップする必要があります。WebSphere AdminService および MBeanServer は、Java 2 セキュリティー権限を使用して厳重に保護されているので、自分のコード・ベースに権限を明示的に付与しないと、これらのクラスのメソッドを呼び出そうとした場合に、セキュリティー例外がスローされます。 MBean をアプリケーションの一部として提供している場合は、アプリケーション・メタデータの一部として提供している was.policy ファイル内に許可を設定することができます。 CustomService インターフェース、または、アプリケーションとして配布されていないその他のコードを使用している場合は、ノード構成内の library.policy ファイル、または特定のインストール用の properties ディレクトリーにある server.policy を編集することができます。

[z/OS]

例: SampleStateMBean MBean

MBeanDescriptor

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE MBean SYSTEM "MbeanDescriptor.dtd">
<MBean type="SampleStateMBean"
  aggregationHandlerClass="com.ibm.ws390.sample.SampleStateAggregationHandler"
  eventHandlerClass="com.ibm.ws390.sample.SampleStateEventHandler"
  invocationHandlerClass="com.ibm.ws390.sample.SampleStateInvocationHandler"
  stateObjectClass="com.ibm.ws390.sample.SampleState"
  version="6.0"
  platform="dynamicproxy"
  description="Sample State MBean for the documentation example.">

  <attribute description="The name of the MBean."
    getMethod="getMBeanName" name="mbeanName" type="java.lang.String"
    proxyInvokeType="unicall"/>
  <attribute description="The state of the MBean."
name="state"
    getMethod="getState" setMethod="setState" type="java.lang.String"
    proxyInvokeType="multicall" proxySetterInvokeType="multicall"/>
  <operation
    description="Initialize the State MBean."
    impact="ACTION" name="initializeState" role="operation"
    targetObjectType="objectReference" type="void" proxyInvokeType="multicall">
    <signature>
      <parameter description="The name of the MBean."
        name="mbeanName" type="java.lang.String"/>
      <parameter description="The initial state of the MBean."
        name="mbeanName" type="java.lang.String"/>
    </signature>
  </operation>
  
  <notification name="j2ee.state.starting" severity="6" log="false"
                description="This sample state MBean is in starting state.">
      <notificationType>j2ee.state.starting</notificationType>
  </notification>
  <notification name="j2ee.state.running" severity="6" log="false"
                description="This sample state MBean is in running state.">
      <notificationType>j2ee.state.running</notificationType>
  </notification>
  <notification name="j2ee.state.stopping" severity="6" log="false"
                description="This sample state MBean is in stopping state.">
      <notificationType>j2ee.state.stopping</notificationType>
  </notification>
  <notification name="j2ee.state.stopped" severity="6" log="false"
                description="This sample state MBean is in stopped state.">
      <notificationType>j2ee.state.stopped</notificationType>
  </notification>    
</MBean>

SampleState の実装

package com.ibm.ws390.sample;

import com.ibm.ejs.ras.Tr;
import com.ibm.ejs.ras.TraceComponent;
import java.io.Serializable;
import com.ibm.websphere.management.dynamicproxy.StateObject;

public class SampleState extends StateObject {
    
    private static TraceComponent tc =
    Tr.register(SampleState.class,"SampleState",null);
    
    // Package protected STATE constants.
    static final String STATE_STARTING = "j2ee.state.starting";
    static final String STATE_RUNNING  = "j2ee.state.running";
    static final String STATE_STOPPING = "j2ee.state.stopping";
    static final String STATE_STOPPED  = "j2ee.state.stopped";
    
    // Dynamicproxy State is initialized with STOPPED state.
    private String state = STATE_STOPPED;
    
    public SampleState() {
        if (tc.isEntryEnabled()) Tr.entry(tc,"<init>");
        
        // State is initialized during "state" initialization,
        // but can also be initialized here in the constructor as well.
        /*
        state = "WebSphere Application Server for z/OS ready for e-business";
        */
        
        if (tc.isEntryEnabled()) Tr.exit(tc,"<init>");
    }
    
    public synchronized String getState() {
        if (tc.isEntryEnabled()) Tr.entry(tc,"getState");
        if (tc.isEntryEnabled()) Tr.exit(tc,"getState",state);
        return state;
    }
    
    public synchronized void setState(String state) {
        if (tc.isEntryEnabled()) Tr.entry(tc,"setState",state);
        this.state = state;
        if (tc.isEntryEnabled()) Tr.exit(tc,"setState");
    }
    
    public synchronized String getStateObjectInfo() {
        return state;
    }
}

SampleStateAggregationHandler の実装

package com.ibm.ws390.sample;

import com.ibm.websphere.management.dynamicproxy.AggregationHandler;
import com.ibm.websphere.management.dynamicproxy.StateObject;

import com.ibm.ejs.ras.Tr;
import com.ibm.ejs.ras.TraceComponent;

public class SampleStateAggregationHandler implements AggregationHandler {
    
    private static TraceComponent tc =
    Tr.register(SampleStateAggregationHandler.class,"SampleState",null);
    
    /**
     * Return an aggregated result from a multicall Mbean operation which
     * compiles through all servant MBeans' results and returns a respective
     * single return value for an invoked method.
     *
     * @param  methodName           MBean method name
     * @param  params               MBean method parameters
     * @param  signatures           MBean method signatures
     * @param  servantMBeanResults  Result of each servant MBean instances
     *                              invoked by the dynamicproxy multicast 
     *                              invocation.
     *                              Note: this value can be "null" OR can be
     *                              an array of "null"s in case return value
     *                              of the method is "void."
Implementation
     *                              of this method MUST handle this case to
     *                              avoid a <code>NullPointerException</code>.
     * @param stateObject
     *        MBean provider provided <code>StateObject</code> used by 
     *        dynamicproxy MBean in CR to manage its state.
Note: this object
     *        MAY BE null if "stateObjectClass" was not specified OR internal
     *        error occurred during initialization of this dynamicproxy MBean.
     *        Implmentation MUST properly handle "null" input.
     *                
     * @return aggregated result as defined by MBean xml for specified
     *         MBean operation.
     */
    public Object aggregateResults(String methodName,
                                   Object[] params,
                                   String[] signatures,
                                   Object[] servantMBeanResults,
                                   StateObject stateObject) {
                                       
        if (tc.isEntryEnabled()) Tr.entry(tc,"aggregateResults",methodName);
        
        // As you can see from the MBeanDescriptor of SampleStateMBean,
        // it declares the following four methods:
        // 1. String getMBeanName()         [proxyInvokeType == unicall]
        // 2. String getState()             [proxyInvokeType == multicall]
        // 3. void setState(String)         [proxyInvokeType == multicall]
        // 4. void initializeState()        [proxyInvokeType == multicall]
        //
        // From these methods, the only one that requires aggregation
        // is #2 getState method which is a multicall MBean operation AND
        // it returns a value that can be aggregated.
        //
        // In this example, we simply take each servants' getState MBean
        // request result and concatenate them into one long String that
        // displays each servants' state. 
        if (methodName.equals("getState")) {
            StringBuffer stateBuf = new StringBuffer();
            
            for (int i=0; i<servantMBeanResults.length; i++) {
                stateBuf.append("SERVANT #" + i + " state ==|" + 
                                servantMBeanResults[i] + "|== ");
            }
            return stateBuf.toString();
        }
        // If we also had an example method which returns say an int, 
        // getNumberOfMBeans(), it can take the similar approach
        // and to add each servants' getNumberOfMBeans() result together here.
        /* example added for non-existent method: int getNumberOfMBeans()
        else if (methodName.equals("getNumberOfMBeans")) {
            int aggregatedResult = 0;
            
            for (int i=0; i<servantMBeanResults.length; i++) {
                aggregatedResult += (int) servantMBeanResults[i];
            }
            return aggregatedResult;
        }
        */
        
        return methodName + " is NOT handled by " + getClass().getName() + "!";
    }
    
}

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjmx_extend
ファイル名:tjmx_extend.html