目次|前|次 | Java Remote Method Invocation |
UnicastRemoteObject
クラスjava.rmi.server.UnicastRemoteObject
クラスは、リモート・オブジェクトの作成とエクスポートをサポートします。このクラスは、次の特性を持ったリモート・サーバー・オブジェクトを実装します。
package java.rmi.server; public class UnicastRemoteObject extends RemoteServer { protected UnicastRemoteObject() throws java.rmi.RemoteException {...} protected UnicastRemoteObject(int port) throws java.rmi.RemoteException {...} protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws java.rmi.RemoteException {...} public Object clone() throws java.lang.CloneNotSupportedException {...} public static RemoteStub exportObject(java.rmi.Remote obj) throws java.rmi.RemoteException {...} public static Remote exportObject(java.rmi.Remote obj, int port) throws java.rmi.RemoteException {...} public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws java.rmi.RemoteException {...} public static boolean unexportObject(java.rmi.Remote obj, boolean force) throws java.rmi.NoSuchObjectException {...} }
UnicastRemoteObject
としてエクスポートされるリモート・オブジェクト実装の場合、エクスポートにはTCPポートでの待機が含まれます。ただし、同じポート上で複数のリモート・オブジェクトが着信呼出しを受け入れるので、必ずしも新しいポートで待機する必要はありません。リモート・オブジェクト実装では、UnicastRemoteObject
クラスを拡張してオブジェクトをエクスポートするコンストラクタを利用するか、あるいは他のいくつかのクラスを拡張して(またはまったく拡張せずに) UnicastRemoteObject
のexportObject
メソッドを使用してオブジェクトをエクスポートできます。
引数を取らないコンストラクタは、リモート・オブジェクトを作成し、実行時に選択された匿名(または任意)のポートでエクスポートします。2つ目の形式のコンストラクタは、portという引数を1つのみ取ります。この引数は、リモート・オブジェクトが着信呼出しを受け入れるポート番号を指定します。3つ目のコンストラクタは、RMIServerSocketFactory
から作成されたServerSocket
を使用して、指定されたportの着信呼出しを受け入れるリモート・オブジェクトを作成してエクスポートします。クライアントは、RMIClientSocketFactory
から提供されたSocket
を使用してリモート・オブジェクトに接続します。
ソケット・ファクトリを指定せずにリモート・オブジェクトをエクスポートするか、RMIClientSocketFactory
およびRMIServerSocketFactory
型のパラメータを含まないバージョンのUnicastRemoteObject.exportObject
メソッドまたはUnicastRemoteObject
コンストラクタを使用してオブジェクトをエクスポートすると、リモート・オブジェクトはすべてのローカル・アドレスにエクスポートされます。リモート・オブジェクトを特定のアドレスにエクスポートするには、「RMIソケット・ファクトリ」を参照してください。
RemoteObject
からの拡張ではない実装のエクスポートexportObject
メソッド(すべての形式)は、UnicastRemoteObject
クラスを拡張することでは実装されない単純なピアツーピア・リモート・オブジェクトをエクスポートするために使用します。exportObject
メソッドの1つ目の形式は、objというパラメータを1つのみ取ります。これは、着信するRMI呼出しを受け入れるリモート・オブジェクトです。このexportObject
メソッドは、実行時に選択された匿名(または任意)のポートにオブジェクトをエクスポートします。2つ目のexportObject
メソッドは、リモート・オブジェクトobj、およびリモート・オブジェクトが着信呼出しを受け入れるポート番号portの2つのパラメータを取ります。3つ目のexportObject
メソッドは、指定されたRMIClientSocketFactory
、csf、RMIServerSocketFactory
ssfを使用して、指定されたportにオブジェクトobjをエクスポートします。
exportObject
メソッドは、リモート・オブジェクトobj
のスタブであり、リモート・オブジェクトの代わりにRMI呼出しで渡されたRemote
Stubを返します。
UnicastRemoteObject
を渡すUnicastRemoteObject
型のオブジェクトがパラメータまたは戻り値として渡されると、このオブジェクトは、リモート・オブジェクトのスタブに代わります。エクスポートされたリモート・オブジェクトの実装は、それが作成された仮想マシン内にとどまり、仮想マシンから(値渡しによってさえ)移動しません。すなわち、エクスポートされたオブジェクトはRMI呼出しでは参照渡しであり、エクスポートされたリモート・オブジェクトの実装は、値では渡すことができないということになります。
UnicastRemoteObject
を直列化するUnicastRemoteObject
に含まれている情報は一時的であり、その型のオブジェクトがユーザー定義のObjectOutputStream
に書き込まれた場合には保存されません(たとえば、オブジェクトが直列化を使用してファイルに書き込まれる場合)。ただし、UnicastRemoteObject
のユーザー定義サブクラスのインスタンスであるオブジェクトは、そのオブジェクトが直列化された場合でも保存可能な、非常駐データでないデータを持つことができます。
UnicastRemoteObject
が、UnicastRemoteObject
のreadObject
メソッドを使ってObjectInputStream
から読み込まれる場合、そのリモート・オブジェクトは、RMI呼出しを受け取れるようにRMIランタイムに自動的にエクスポートされます。オブジェクトのエクスポートが何らかの原因で失敗した場合には、オブジェクトの直列化復元は、例外とともに途中で終了します。
UnicastRemoteObject
のアンエクスポートunexportObject
メソッドを使うと、着呼がリモート・オブジェクトobjを利用できなくなります。パラメータforceがtrueに設定されていると、リモート・オブジェクトへの保留状態の呼出しがある場合や、進行中の呼出しがある場合でも、オブジェクトは強制的にアンエクスポートされます。forceパラメータがfalseの場合は、オブジェクトに対する保留中または進行中の呼出しがない場合だけ、オブジェクトがアンエクスポートされます。オブジェクトが正常にアンエクスポートされた場合は、RMIのランタイムによってそのオブジェクトが内部テーブルから削除されます。このような強制的な方法でオブジェクトをアンエクスポートすると、クライアントがリモート・オブジェクトへの無効なリモート参照を保持したままになることがあります。オブジェクトが事前にRMIランタイムにエクスポートされなかった場合は、このメソッドはjava.rmi.NoSuchObjectException
をスローします。
clone
メソッドjava.lang.Cloneable
インタフェースをサポートしている場合に、Java言語のデフォルトのメカニズムを使用することによってのみ可能になります。java.rmi.server.UnicastRemoteObject
クラスは、このインタフェースを実装していませんが、サブクラスがCloneable
を実装する必要がある場合に、そのリモート・オブジェクトが正しく複製されるように、clone
メソッドを実装しています。サブクラスは、clone
メソッドを使用して、始めの部分は同じ内容のリモート・オブジェクトの複製を作成できます。ただし、この複製は、エクスポートされてリモート呼出しを受け入れるため、元のオブジェクトとは別のオブジェクトです。