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

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

ソケット・ファクトリを指定せずにリモート・オブジェクトをエクスポートするか、RMIClientSocketFactoryおよびRMIServerSocketFactory型のパラメータを含まないバージョンのUnicastRemoteObject.exportObjectメソッドまたはUnicastRemoteObjectコンストラクタを使用してオブジェクトをエクスポートすると、リモート・オブジェクトはすべてのローカル・アドレスにエクスポートされます。リモート・オブジェクトを特定のアドレスにエクスポートするには、「RMIソケット・ファクトリ」を参照してください。


5.3.2 RemoteObjectからの拡張ではない実装のエクスポート

exportObjectメソッド(すべての形式)は、UnicastRemoteObjectクラスを拡張することでは実装されない単純なピアツーピア・リモート・オブジェクトをエクスポートするために使用します。exportObjectメソッドの1つ目の形式は、objというパラメータを1つのみ取ります。これは、着信するRMI呼出しを受け入れるリモート・オブジェクトです。このexportObjectメソッドは、実行時に選択された匿名(または任意)のポートにオブジェクトをエクスポートします。2つ目のexportObjectメソッドは、リモート・オブジェクトobj、およびリモート・オブジェクトが着信呼出しを受け入れるポート番号portの2つのパラメータを取ります。3つ目のexportObjectメソッドは、指定されたRMIClientSocketFactorycsfRMIServerSocketFactory 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, 2010, Oracle and/or its affiliates. All rights reserved.