モジュール java.management.rmi

パッケージ javax.management.remote.rmi


パッケージjavax.management.remote.rmi

RMIコネクタは、RMIを使ってクライアント要求をリモートMBeanサーバーへ転送する、JMXリモートAPI用のコネクタです。 このパッケージでは、RMIコネクタのユーザーが、クライアント側およびサーバー側で直接参照する必要があるクラスを定義します。 ユーザーが通常は直接参照しないクラスも定義しますが、これらのクラスは、RMIコネクタの実装が異なる場合も相互運用できるように定義する必要があります。

RMIコネクタは、RMI用のJRMPトランスポートをサポートします。

JMXリモートAPIのほとんどのコネクタと同様に、RMIも通常はアドレスとしてJMXServiceURLを持っています。 このアドレスのプロトコル部分は、デフォルトのRMIトランスポート(JRMP)を使用するコネクタのrmiです。

RMIコネクタ・アドレスには、次の2つの形式があります。

  • JNDI形式。URLは、コネクタのRMIスタブがある場所を示します。 このRMIスタブはコネクタ・サーバーへのリモート・アクセスを提供するRMIServer型のJavaオブジェクトです。 このアドレス形式を使用して、URL内の外部ディレクトリ・エントリからRMIスタブが取得されます。 外部ディレクトリは、JNDIによって認識されるディレクトリのどれかで、通常はRMIレジストリ、LDAPまたはCOSネーミングです。
  • エンコード形式。URLには、コネクタ・サーバーとの接続に必要な情報が直接含まれます。 RMI/JRMPを使用する場合、エンコード形式は、埋込み改行文字なしでBASE64エンコード処理された、サーバー・オブジェクトの直列化済RMIスタブです。

アドレスの詳細は次で説明します。

RMIコネクタ・サーバーの作成

通常、RMIコネクタ・サーバーを作成するには、JMXConnectorServerFactory.newJMXConnectorServerメソッドにRMIコネクタ・アドレスを指定します。 コネクタ・サーバーの接続先MBeanサーバーも、このメソッドのパラメータとして指定できます。 別の方法として、コネクタ・サーバーをMBeanとしてMBeanサーバーに登録することもできます。

RMIコネクタ・サーバーの作成は、明示的にまたはMBeanサーバーのcreateMBeanメソッドを介して、RMIConnectorServerのインスタンスを構築することによって行うこともできます。

RMIトランスポートの選択

コネクタ・サーバーの作成時にserviceURLprotocol部分にrmiを指定することにより、RMIトランスポートを選択することができます。 RMIServerImplの適切なサブクラスをインスタンス化し、RMIConnectorServerコンストラクタに指定することによって、特別なコネクタ・サーバーを作成することもできます。

サーバーによって生成されたコネクタ・アドレス

指定したserviceURLのURLパスが空の場合(オプションのホストとポートに続く部分)、またはserviceURLを指定しなかった場合、コネクタ・サーバーにより、クライアントが接続のために使用できる新しいJMXServiceURLが作成されます。

  • 次のようなserviceURLの場合:

            service:jmx:rmi://host:port
            

    コネクタ・サーバーはRMIJRMPServerImplを生成し、次のようなJMXServiceURLが返されます。

            service:jmx:rmi://host:port/stub/XXXX
            

    ここでXXXXは、改行文字なしでBASE64エンコード処理された、生成されたオブジェクトの直列化形式のスタブです。

  • serviceURLが存在しない場合、ユーザー指定のRMIServerImplが必要になります。 コネクタ・サーバーは、rmi形式を使用してJMXServiceURLを生成します。

ユーザー指定のserviceURL内のhostはオプションです。 存在する場合、生成されたJMXServiceURLにコピーされますが、存在しない場合は無視されます。 存在しない場合、生成されたJXMServiceURLはローカル・ホスト名を持ちます。

ユーザー指定のserviceURL内のportもオプションです。 存在する場合、生成されたJMXServiceURLにもコピーされます。存在しない場合、生成されたJMXServiceURLはポートを持ちません。 rmiプロトコルを使用するserviceURLでは、port (存在する場合)が、生成されたリモート・オブジェクトがエクスポートされるポートを示します。 それ以外の影響はありません。

ユーザーがJMXServiceURLではなくRMIServerImplを指定した場合、生成されたJMXServiceURLhost部分にローカル・ホスト名が入ります。portはありません。

ディレクトリ・エントリに基づくコネクタ・アドレス

コネクタ・サーバーの作成時に指定されるserviceURLアドレスには、生成されたアドレス(前述)の代わりに、指定または生成されたRMIServerスタブの格納先となるディレクトリ・アドレスを指定することもできます。 この場合、クライアントでもサーバーでも、このディレクトリ・アドレスが使用されます。

この場合、serviceURLの形式は次のとおりです:

    service:jmx:rmi://host:port/jndi/jndi-name
    

jndi-nameは、javax.naming.InitialContext.bindに指定可能な文字列です。

ここでも、host:portは省略可能です。

コネクタ・サーバーは、プロトコル(rmi)とport(存在する場合)に基づいてRMIServerImplを生成します。 コネクタ・サーバーは、起動時に、toStubメソッドを使ってこのオブジェクトからスタブを派生し、指定されたjndi-nameを使用してオブジェクトを格納します。 通常どおり、JNDI APIによって定義されたプロパティが照会されます。

たとえば、次のようなJMXServiceURLの場合:

      service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
      
コネクタ・サーバーはRMIJRMPServerImplを生成し、下記JNDI名を使ってそのスタブを格納します。
      rmi://myhost/myname
      
これは、ホストmyhostのデフォルト・ポートで実行されているRMIレジストリ内のエントリmynameです。 RMIレジストリは、ローカル・ホストからの登録を許可するだけです。 したがって、この場合、myhostは、コネクタ・サーバーが実行されているホストの名前になります。

このJMXServiceURLでは、最初のrmi: でRMIコネクタ、2番目のrmi:でRMIレジストリを指定します。

もう1つ例を挙げます。次のようなJMXServiceURLの場合:

      service:jmx:rmi://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that
      
コネクタ・サーバーはRMIJRMPServerImplを生成し、下記JNDI名を使ってそのスタブを格納します。
      ldap://dirhost:9999/cn=this,ou=that
      
これは、ホストdirhostのポート9999で実行されているLDAPディレクトリ内のエントリcn=this,ou=thatです。

JMXServiceURLが次の場合:

      service:jmx:rmi://ignoredhost/jndi/cn=this,ou=that
      
コネクタ・サーバーはRMIJRMPServerImplを生成し、下記JNDI名を使ってそのスタブを格納します。
      cn=this,ou=that
      
この場合、JNDI APIを適切に構成して、使用するディレクトリの情報を指定する必要があります。

これらの例では、コネクタ・サーバーもコネクタ・クライアントも、ホスト名ignoredhostを使用しません。 これは省略可能です。次の例を参照してください。

      service:jmx:rmi:///jndi/cn=this,ou=that
      

それでも、コネクタ・サーバーが実行されているホストの名前を使用することをお勧めします。 通常、このホスト名は、ディレクトリ・ホスト名とは異なります。

コネクタ・サーバー属性

デフォルトのJRMPトランスポートの使用時は、RMIConnectorServerコンストラクタに指定されたenvironmentjmx.remote.rmi.client.socket.factoryおよびjmx.remote.rmi.server.socket.factory属性を使って、RMIソケット・ファクトリを指定できます。 これらの属性の値は、それぞれRMIClientSocketFactory型とRMIServerSocketFactory型である必要があります。 これらのファクトリは、コネクタに関連付けられたRMIオブジェクトを作成するとき使用されます。

RMIコネクタ・クライアントの作成

RMIクライアントは、通常rmiをプロトコルとして持つJMXServiceURLを使用してJMXConnectorFactoryを使用して構築されます。

JMXServiceURLがサーバーで生成された場合(前述の「サーバーによって生成されたコネクタ・アドレス」を参照)、クライアントは、このURLを直接または間接的にサーバーから取得する必要があります。 通常、サーバーは、JMXServiceURLを使用可能にするために、このURLをファイルまたは検索サービスに格納します。

JMXServiceURLがディレクトリ構文を使用する場合(前述の「ディレクトリ・エントリに基づくコネクタ・アドレス」を参照)、クライアントは説明したようにこれを取得できます。または、クライアントとサーバーの両方が、使用する適切なディレクトリ・エントリを認識できます。 たとえば、Whatsitエージェントのコネクタ・サーバーが、ホストmyhost上のRMIレジストリに格納されているエントリwhatsit-agent-connectorを使用する場合、クライアントとサーバーの両方が次のような適切なJMXServiceURLを認識できます。

    service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector
    

RMIスタブの型がRMIServerである場合は、RMIConnectorの適切なコンストラクタを使ってRMI接続を直接構築できます。

コードの動的ダウンロード

RMIコネクタ・クライアントまたはサーバーがそのピアから未知のクラスのインスタンスを受信した場合、RMI接続でコードの動的ダウンロードが有効になっているときは、ピアによって指定されたコード・ベースからクラスをダウンロードできます。 「Java RMIガイド」はこれをより詳細に説明します。

導入されたバージョン:
1.5
関連項目:
RFC 2045、セクション6.8、"Base64 Content-Transfer-Encoding"
  • インタフェースのサマリー
    インタフェース
    説明
    クライアントからサーバー側のMBeanServer実装へMBeanServer要求を転送するために使用されるRMIオブジェクトです。
    RMIコネクタとの接続の確立に使用されるRMIオブジェクトです。
  • クラスのサマリー
    クラス
    説明
    RMIConnectionインタフェースの実装です。
    RMIConnectionImplリモート・スタブ。
    リモートRMIコネクタへの接続です。
    リモート・クライアントからのRMIベースの接続を作成するJMX APIコネクタ・サーバーです。
    非推奨。
    このトランスポートはサポートされなくなりました。
    JRMP経由でエクスポートされるRMIServerオブジェクトであり、JRMP経由でエクスポートされたRMIオブジェクトとしてクライアント接続を作成します。
    コネクタ・サーバーを表すRMIオブジェクトです。
    RMIServerImplリモート・スタブ。