目次 | 前の項目 | 次の項目 Java Remote Method Invocation


5.3 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 {...}
}



5.3.1 新しいリモートオブジェクトを作成する

1 つまたは複数のリモートインタフェースを実装するリモートオブジェクト実装を 1 つ作成し、エクスポートする必要があります。リモートオブジェクトをエクスポートすることにより、そのオブジェクトは、クライアントからの呼び出しを受け入れることができるようになります。UnicastRemoteObject としてエクスポートされるリモートオブジェクト実装の場合は、エクスポートには TCP ポートでの待機が含まれます。ただし、同じポート上で複数のリモートオブジェクトが着信する呼び出しを受けられるので、必ずしも新しいポートで待機する必要はありません。リモートオブジェクト実装では、UnicastRemoteObject クラスを拡張してオブジェクトをエクスポートするコンストラクタを利用するか、あるいはほかのいくつかのクラスを拡張して (またはまったく拡張せずに) UnicastRemoteObjectexportObject メソッドを使ってオブジェクトをエクスポートすることができます。

引数のないコンストラクタは、リモートオブジェクトを作成し、実行時に選択された匿名 (または任意) のポートにエクスポートします。2 つ目の形式のコンストラクタは、port という引数を 1 つだけ取ります。 この引数は、リモートオブジェクトが着呼を受け入れるポート番号を指定します。3 つ目のコンストラクタは、RMIClientSocketFactory から作成された ServerSocket を使って、指定された port の着呼を受け入れるリモートオブジェクトを作成してエクスポートします。 クライアントは、RMIClientSocketFactory から提供された Socket を使ってリモートオブジェクトに接続します。


5.3.2 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 呼び出しで渡された RemoteStub を返します。


5.3.3 RMI 呼び出しで UnicastRemoteObject を渡す

上述したように、RMI 呼び出しの中で、エクスポートされた UnicastRemoteObject 型のオブジェクトがパラメータまたは戻り値として渡されると、このオブジェクトは、リモートオブジェクトのスタブに代わります。エクスポートされたリモートオブジェクトの実装は、それが作成された仮想マシン内にとどまり、仮想マシンから (値渡しによってさえ) 移動しません。すなわち、エクスポートされたオブジェクトは RMI 呼び出しでは参照渡しであり、エクスポートされたリモートオブジェクトの実装は、値では渡すことができないということになります。


5.3.4 UnicastRemoteObject を直列化する

UnicastRemoteObject に含まれている情報は一時的であり、その型のオブジェクトがユーザー定義の ObjectOutputStream に書き込まれた場合には保存されません (たとえば、オブジェクトが直列化を使用してファイルに書き込まれる場合)。ただし、UnicastRemoteObject のユーザー定義サブクラスのインスタンスであるオブジェクトは、そのオブジェクトが直列化された場合でも保存可能な、非常駐データでないデータを持つことができます。

UnicastRemoteObject が、UnicastRemoteObjectreadObject メソッドを使って ObjectInputStream から読み込まれる場合、そのリモートオブジェクトは、RMI 呼び出しを受け取れるように RMI ランタイムに自動的にエクスポートされます。オブジェクトのエクスポートが何らかの原因で失敗した場合には、オブジェクトの直列化復元は、例外とともに途中で終了します。


5.3.5 UnicastRemoteObject のアンエクスポート

unexportObject メソッドを使うと、着呼がリモートオブジェクト obj を利用できなくなります。パラメータ force が true に設定されていると、リモートオブジェクトへの保留状態の呼び出しがある場合や、進行中の呼び出しがある場合でも、オブジェクトは強制的にアンエクスポートされます。force パラメータが false の場合は、オブジェクトに対する保留中または進行中の呼び出しがない場合だけ、オブジェクトがアンエクスポートされます。オブジェクトが正常にアンエクスポートされた場合は、RMI のランタイムによってそのオブジェクトが内部テーブルから削除されます。このような強制的な方法でオブジェクトをアンエクスポートすると、クライアントがリモートオブジェクトへの無効なリモート参照を保持したままになることがあります。オブジェクトが事前に RMI のランタイムにエクスポートされていない場合は、このメソッドは、java.rmi.NoSuchObjectException をスローします。


5.3.6 clone メソッド

オブジェクトの複製は、オブジェクトが java.lang.Cloneable インタフェースをサポートしている場合に、Java 言語のデフォルトの機構を使うことによってのみ可能になります。java.rmi.server.UnicastRemoteObject クラスは、このインタフェースを実装していませんが、サブクラスが Cloneable を実装する必要がある場合に、そのリモートオブジェクトが正しく複製されるように、clone メソッドを実装しています。サブクラスは、clone メソッドを使って、始めの部分は同じ内容のリモートオブジェクトの複製を作成できます。 ただし、この複製は、エクスポートされてリモート呼び出しを受け付けるため、元のオブジェクトとは別のオブジェクトです。



目次 | 前の項目 | 次の項目
Copyright © 1997-2006 Sun Microsystems, Inc. All Rights Reserved.