モジュール java.management

パッケージ javax.management

Java Management Extensionsのコア・クラスを提供します。

Java Management Extensions (JMX™) APIは、管理とモニタリングのための標準APIです。 一般に、次の用途で使用されます。

  • アプリケーションの構成の参照および変更
  • アプリケーションの動作に関する統計情報の蓄積および有効化
  • 状態の変化とエラー条件の通知

JMX APIは、システムやネットワークの管理ソリューションにも使用されます。

リモート管理プログラムは、APIのリモート・アクセス機能を利用して、実行中のアプリケーションにリモート・アクセスできます。

MBean

JMX APIの基本概念はMBeanです。 MBeanは、リソースを表す名前付きの管理オブジェクトです。 publicである必要があり、次のように構成された管理インタフェースを持ちます。

  • 読み取りや書込みが可能な名前と型の指定された属性
  • 呼出し可能な名前と型の指定されたオペレーション
  • MBeanから発行可能な型が指定された通知

たとえば、アプリケーションの構成を表すMBeanは、複数の異なった構成項目を表す属性を持つことができます。 CacheSize属性を読み取った場合、その項目の現在の値が返されます。 同属性を書き込んだ場合、項目が更新され、実行中のアプリケーションの動作が変化する可能性があります。 saveなどのオペレーションでは、現在の構成を永続的に保存できます。 ConfigurationChangedNotificationなどの通知は、構成の変更のたびに送信できます。

JMX APIの標準的な使用方法では、MBeanはJavaオブジェクトとして実装されます。 しかし、次に説明するとおり、通常これらのオブジェクトが直接参照されることはありません。

Standard MBean

MBean実装を単純化するため、JMX APIにはStandard MBeanの概念が導入されています。 標準MBeanは、JavaBeans™で使用されているのと同じような特定のネーミング・パターンを使用して、Javaインタフェースから属性および操作が導かれるMBeanです。 たとえば、次のようなインタフェースがあるとします。

    public interface ConfigurationMBean {
         public int getCacheSize();
         public void setCacheSize(int size);
         public long getLastChangedTime();
         public void save();
    }
        

getCacheSizeメソッドとsetCacheSizeメソッドは、CacheSize (JavaBeansの規則とは異なり、最初の文字がアルファベットの大文字)という名前のint型の読取り書き込み属性を定義します。

getLastChangedTimeメソッドは、LastChangedTimeという名前のlong型の属性を定義します。 これは、setLastChangedTimeメソッドが存在しないため、読取り専用属性です。

saveメソッドは、saveという名前のオペレーションを定義します。 getset、またはisで始まる名前を持たないので、属性ではありません。

Standard MBeanの正確なネーミング・パターンの詳細については、JMX仕様を参照してください。

この管理インタフェースで、MBeanであるJavaオブジェクトを作成する方法は2とおり存在します。 1つは、Javaインタフェースの名前からMBean接尾辞を除いた名前を持つクラスに属するオブジェクトを作成する方法です。 例では、オブジェクトは、ConfigurationMBeanと同じJavaパッケージのConfigurationクラスに属することになります。 もう1つの方法では、StandardMBeanクラスを使用します。

MXBean

MXBeanはStandard MBeanのバリアントで、複雑な型がjavax.management.openmbeanパッケージで定義された標準セットの型にマッピングされます。 そうしないとMBeanインタフェースでアプリケーション固有のクラスを参照する必要がある場合に、MXBeanが適しています。 詳細は、MXBeanの仕様を参照してください。

Dynamic MBean

Dynamic MBeanは、管理インタフェースを実行時に定義するMBeanです。 たとえば、構成MBeanは、XMLファイルの解析により、公開する属性の名前と型を決定できます。

DynamicMBeanインタフェースを実装するクラスのJavaオブジェクトはDynamic MBeanになります。

Open MBean

Open MBeanはDynamic MBeanの一種であり、その属性およびオペレーション・パラメータの型と戻り値は、いくつかの事前定義済みのJavaクラスを使って構築されます。 Open MBeanは、アプリケーション固有の型(非Javaプログラムを含む)に必ずしもアクセスできるとはかぎらないリモート管理プログラムを使って、オペレーションを簡便化します。 Open MBeanは、パッケージ javax.management.openmbeanで定義されます。

Model MBean

Model MBeanは、管理インタフェースと配下の管理対象リソースのブリッジとして機能するDynamic MBeanの一種です。 管理インタフェースと管理対象リソースは、どちらもJavaオブジェクトとして指定されます。 複数の異なった管理インタフェースおよび管理対象リソースで、同じModel MBean実装を繰返し利用できます。また、Model MBean実装は、永続性機能、キャッシング機能などの共通機能を提供できます。 Model MBeanは、パッケージ javax.management.modelmbeanで定義されます。

MBeanサーバー

MBeanを使用するためには、MBeanサーバーに登録する必要があります。 MBeanサーバーは、MBeanのリポジトリです。 通常、MBeanサーバーを利用しなければ、MBeanにはアクセスできません。 コードは、MBeanを直接実装するJavaオブジェクトにアクセスする代わりに、MBeanの名前を指定してMBeanサーバー経由でMBeanにアクセスするようになりました。 各MBeanは、MBeanサーバー内に、ObjectNameクラスによって定義された一意の名前を持ちます。

MBeanサーバーは、MBeanServerインタフェースを実装するオブジェクトです。 もっとも便利なMBeanサーバーは、プラットフォームMBeanサーバーです。 これは、単一のJava仮想マシン内で動作する異なる管理コンポーネントで共有可能な単独のMBeanサーバーです。 プラットフォームMBeanサーバーには、ManagementFactory.getPlatformMBeanServer()メソッドでアクセスします。

アプリケーション・コードでも、MBeanServerFactoryクラスを使って新しいMBeanサーバーを作成したり、既存のMBeanサーバーにアクセスしたりできます。

MBeanサーバーでのMBeanの作成

MBeanは2とおりの方法で作成できます。 1つ目の方法は、MBeanであるJavaオブジェクトを作成し、registerMBeanメソッドでそのオブジェクトをMBeanサーバーに登録します。 もう1つの方法では、createMBeanメソッドの1つを使用して単一オペレーションでMBeanの作成および登録を行います。

registerMBeanメソッドは、ローカルでの使用を目的とした単純な構造となっていますが、リモートで使用することはできません。 createMBeanメソッドは、リモートで使用できますが、場合によってクラスのロードに注意を払う必要があります。

MBeanサーバーでMBeanRegistrationインタフェースを導入している状態でMBeanをそのMBeanサーバーに登録またはそのサーバーから登録解除する場合、そのMBeanでアクションを実行できます。

MBeanサーバー内のMBeanへのアクセス

次の例のように、ObjectName nameMBeanServer mbsを指定することにより、属性とオペレーションにアクセスできます。

    int cacheSize = mbs.getAttribute(name, "CacheSize");
    Attribute newCacheSize =
         new Attribute("CacheSize", new Integer(2000));
    mbs.setAttribute(name, newCacheSize);
    mbs.invoke(name, "save", new Object[0], new Class[0]);
        

MBeanの管理インタフェースに対応するJavaインタフェースがある場合は、次のように、MBeanプロキシを利用できます。

    ConfigurationMBean conf =
        JMX.newMBeanProxy(mbs, name, ConfigurationMBean.class);
    int cacheSize = conf.getCacheSize();
    conf.setCacheSize(2000);
    conf.save();
        

MBeanプロキシは非常に便利です。 2番目の例では、最初の例と同じMBeanServerオペレーションを呼び出します。

MBeanサーバーで、特定のパターンに一致する名前を持つMBeanや、特定の制約を満たす属性を持つMBeanを照会できます。 名前パターンの構築にはObjectNameクラスを使用し、制約の構築にはQueryクラスを使用します。 その後、queryNamesメソッドとqueryMBeansメソッドによりクエリーが実行されます。

MBeanライフ・サイクル

MBeanは、MBeanサーバーに登録および登録解除された場合に指示されるように、MBeanRegistrationインタフェースを実装できます。 また、preRegisterメソッドにより、MBeanはMBeanServerオブジェクトへの参照と、MBeanサーバー内のObjectNameを取得できます。

通知

通知は、Notificationクラスまたはサブクラスのインスタンスです。 Javaクラスに加えて、同じクラスの通知の区別に使用する文字列を持っています。

通知を発行するMBeanは、NotificationBroadcasterまたはNotificationEmitterインタフェースを実装する必要があります。 通常、これらのインタフェースを実装するために、NotificationBroadcasterSupportのサブクラス化か、このクラスのインスタンスの委譲が行われます。 次はその例です。

    public class Configuration extends NotificationBroadcasterSupport
            implements ConfigurationMBean {
        ...
        private void updated() {
            Notification n = new Notification(...);
            sendNotification(n);
        }
    }
        

通知は、リスナーを使って受信できます。リスナーは、NotificationListenerインタフェースを実装するオブジェクトです。 MBeanServer.addNotificationListener(ObjectName, NotificationListener, NotificationFilter, Object)メソッドを使って、MBeanにリスナーを追加できます。 オプションで、このメソッドにフィルタを適用して、必要な通知のみを選択することもできます。 フィルタは、NotificationFilterインタフェースを実装するオブジェクトです。

MBeanは、同じMBeanサーバー上のその他のMBeanによって発行される通知のリスナーになることができます。 この場合、MBeanは、NotificationListenerを実装し、MBeanServer.addNotificationListener(ObjectName, ObjectName, NotificationFilter, Object)メソッドを利用して通知を待機します。

MBeanへのリモート・アクセス

MBeanサーバーには、コネクタ経由でリモート・アクセスできます。 コネクタを使用すると、リモートのJavaアプリケーションが、ローカルのJavaアプリケーションと実質的に同じ方法でMBeanサーバーにアクセスできます。 パッケージ javax.management.remoteはコネクタを定義します。

JMX仕様には、アダプタの概念も定義されています。 アダプタは、SNMPやHTMLなどのプロトコル内で要求を変換して、MBeanサーバーにアクセスします。 たとえば、SNMP GETオペレーションによりMBeanサーバー上でgetAttributeが実行されます。

JMX仕様のバージョン間の相互運用性

クライアントがJMX Remote APIを使用してサーバーに接続した場合、JMX仕様のバージョンが同じではないことがあります。 ここで説明しているJMX仕様のバージョンはバージョン1.4です。 以前のバージョンは1.0、1.1、および1.2でした。 (1.3はありませんでした。) 標準JMX Remote APIはバージョン1.2以降で動作するように定義されているため、標準ベースの配備で発生する相互運用性の問題は、バージョン1.2以降のみに関係があります。

JMX仕様のすべてのバージョンは、以前のバージョンの機能を引き続き実装しています。 このため、クライアントがサーバーより前のバージョンを実行していても、相互運用性の問題は発生しないはずです。

クライアントがサーバーよりあとのバージョンを実行している場合は、次のセクションで説明しているとおり、特定の新機能が使用できない可能性があります。 クライアントは、 MBeanServerDelegateSpecificationVersion属性を調査してサーバーのバージョンを判別できます。

リモートのMBeanサーバーが1.2の場合

  • ObjectNameのキーのプロパティに、domain:type=Foo,name=*など、ワイルドカードを使用することはできません。 ただし、*:**:type=Foo,*など、プロパティ全体に一致するワイルドカードは許可されます。

  • クエリー内でQuery.isInstanceOfは使用できません。

  • javax.management.monitorパッケージのドキュメントに記述されているとおり、モニターの監視対象の属性 HeapMemoryUsage.usedなどのドット構文を使用することはできません。

導入されたバージョン:
1.5
関連項目:
JavaプラットフォームのJMXテクノロジに関するドキュメント、特に『JMX仕様、バージョン1.4』(pdf)。