パッケージ 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トランスポートの選択
コネクタ・サーバーの作成時にserviceURL
のprotocol
部分に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
を指定した場合、生成されたJMXServiceURL
のhost
部分にローカル・ホスト名が入ります。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
コンストラクタに指定されたenvironment
のjmx.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リモート・スタブ。