Activatable
を拡張しないこのチュートリアルでは、起動可能なリモートオブジェクトを実装する方法について説明しますが、リモートオブジェクトの実装で java.rmi.activation.Activatable
クラスを拡張しないという点で、「アクティベーションの使用: Activatable
を拡張する」チュートリアルとは異なります。この実装では、Activatable
クラスの static メソッドを使って、起動可能なリモートオブジェクトをエクスポートします。このチュートリアルでは、Setup
プログラム (「アクティベーションの使用: Setup
プログラム」チュートリアルを参照) を使用します。このプログラムは、起動可能なリモートオブジェクトに関する情報を JavaTM Remote Method Invocation (Java RMI) 起動システムデーモン (rmid
) に登録し、rmiregistry
でそのリモートオブジェクトのスタブをバインドして、クライアントが検索できるようにします。このチュートリアルの前に、Setup プログラムのチュートリアルを読むことをお勧めします。
このチュートリアルでは、次の手順を実行します。
このチュートリアルの実行に必要なファイルは、次のとおりです。
MyRemoteInterface.java
- 単純なリモートインタフェースDoesNotExtendActivatable.java
- リモートインタフェースの「起動可能な」実装Client.java
- リモートインタフェースを使用するクライアントclient.policy
- クライアントのセキュリティーポリシーファイル起動可能なリモートオブジェクトを実装するには、いくつかの基本的な方法があります。このチュートリアルでは、java.rmi.activation.Activatable
クラスの static メソッドを使用して起動可能なリモートオブジェクトをエクスポートすることで起動可能なリモートオブジェクトを実装する方法について説明します。
リモートオブジェクトは、クライアントが起動可能なリモートオブジェクトのスタブでリモートメソッドを呼び出すときに起動されます。起動可能なリモートオブジェクトのスタブには、リモートオブジェクトの起動識別子と、そのリモートオブジェクトの Java RMI 起動システムデーモン (rmid
) にコンタクトする方法に関する情報が含まれます。スタブは、リモートオブジェクトの最新のアドレス (つまり、ホスト/ポート) に接続できない場合、リモートオブジェクトのアクティベータ (rmid
) にコンタクトしてそのオブジェクトを起動します。rmid
は、起動要求を受け取ると、リモートオブジェクトの起動グループがまだ実行されていない場合は、そのグループ (またはコンテナ) の VM を起動します。次に、rmid
は、グループにそのリモートオブジェクトのインスタンスを作成するように要求します。グループは、リモートオブジェクトを構築すると、そのリモートオブジェクトのスタブを rmid
に返します。次に、rmid は実際のスタブを起動スタブに返して、起動スタブが将来そのリモートオブジェクトにコンタクトする方法についての情報を更新できるようにします。
このアクティベーションを行う前に、アプリケーションでは、使用する必要のある起動可能なリモートオブジェクトに関する情報を登録する必要があります。次の別個のチュートリアルでは、リモートオブジェクトの起動に必要な情報と、その情報を rmid
に登録する方法について説明します。
この例では、起動可能なリモートオブジェクトが次の examples.activation.MyRemoteInterface
リモートインタフェースを実装します。
package examples.activation; import java.rmi.*; public interface MyRemoteInterface extends Remote { Object remoteMethod(Object obj) throws RemoteException; }
起動可能なリモートオブジェクトの examples.activation.DoesNotExtendActivatable
実装クラスは次のとおりです。
package examples.activation; import java.rmi.*; import java.rmi.activation.*; public class DoesNotExtendActivatable implements MyRemoteInterface { private final ActivationID id; public DoesNotExtendActivatable(ActivationID id, MarshalledObject data) throws RemoteException { this.id = id; Activatable.exportObject(this, id, 0); } public Object remoteMethod(Object obj) { return obj; } }
DoesNotExtendActivatable
クラスは、MyRemoteInterface
リモートインタフェースを実装しますが、どのクラスも拡張しません。
DoesNotExtendActivatable
クラスは、起動グループが起動プロセス中にインスタンスを構築するために呼び出す特別な「起動」コンストラクタを宣言します。この特別なコンストラクタは、次の 2 つのパラメータを取ります。
ActivationID
で、起動可能なリモートオブジェクトの識別子です。アプリケーションが起動記述子を rmid
に登録すると、rmid
はそれに起動識別子を割り当て、この起動識別子が記述子に関連する情報を参照します。リモートオブジェクトが起動されると、この同じ起動識別子 (リモートオブジェクトのスタブにも含まれている) がコンストラクタに渡されます。MarshalledObject
で、rmid
にあらかじめ登録された初期化データが含まれています。この初期化データには、たとえば、オブジェクトの持続状態が書かれたファイル名などがあります。この例では、リモートオブジェクトを構築する初期化データは必要ありません。コンストラクタは、private フィールドに起動識別子を保存してから static メソッド Activatable.exportObject
を呼び出し、実装自体 (this
)、起動識別子、およびポート番号 0
を渡して、オブジェクトを匿名の TCP ポートでエクスポートする必要があることを示します。この実装では、保存している起動識別子を実際に使うことはありませんが、この例では、起動可能なオブジェクトの通常の実装での操作を示すために、起動識別子を保存しています。このような実装では、たとえばオブジェクトを終了するために、将来起動識別子が必要になることがあります。
最後に、クラスは、リモートインタフェースの単一メソッドである remoteMethod
を実装して、引数として渡されたオブジェクトを返します。
Client
プログラムは、オプションの第 1 引数として提供されたホストのレジストリ内のリモートオブジェクトのスタブ (リモートインタフェース MyRemoteInterface
を実装するスタブ) を検索して、そのスタブの remoteMethod
メソッドを呼び出します。クライアントプログラムは、「アクティベーションの使用: Activatable
を拡張する」チュートリアルで説明されているものと同じです。詳細は、そのチュートリアルの次のセクションを参照してください
この例のソースファイルは、次のようにしてコンパイルできます。
javac -d implDir MyRemoteInterface.java DoesNotExtendActivatable.java javac -d clientDir MyRemoteInterface.java Client.java
implDir は実装のクラスファイルを配置する生成先ディレクトリで、clientDir はクライアントのクラスファイルを配置する生成先ディレクトリです。
Setup
プログラムの実行実装段階が完了したら、起動可能なオブジェクトに関する情報を登録して、クライアントが使えるようにする必要があります。Setup
プログラムは、「アクティベーションの使用: Setup
プログラム」チュートリアルで説明されているように、起動可能なオブジェクトの起動記述子を rmid
に登録し、rmiregistry
でリモートオブジェクトのスタブをバインドして、クライアントが検索できるようにします。
この例の Setup
プログラムを実行するには、Setup プログラムのチュートリアルのセクション「rmid
、rmiregistry
、および Setup
プログラムの起動」を参照してください。rmid
、rmiregistry
、および Setup
プログラム自体の起動方法について説明しています。
Setup
チュートリアルの手順に従って rmid
と rmiregistry
を実行したら、Setup
プログラムを実行して、examples.activation.DoesNotExtendActivatable
クラスを実装する起動可能なオブジェクトの起動記述子を登録する必要があります。次のコマンド行では、使用する各コードベースの適切なファイル URL を指定して Setup
プログラムを実行します。
java -cp setupDir:implDir \ -Djava.security.policy=setup.policy \ -Djava.rmi.server.codebase=file:/implDir/ \ -Dexamples.activation.setup.codebase=file:/setupDir/ \ -Dexamples.activation.impl.codebase=file:/impDir/ \ -Dexamples.activation.name=examples.activation.MyRemoteInterface \ -Dexamples.activation.policy=group.policy \ examples.activation.Setup examples.activation.DoesNotExtendActivatable
次にそれぞれの意味を示します。
Setup
プログラムのクラスのルートディレクトリですSetup
プログラムのセキュリティーポリシーファイルですexamples.activation.file
システムプロパティーは、DoesNotExtendActivatable
実装クラスでは使用されないため、指定する必要はありません。前述の各ファイル URL には、必須の末尾のスラッシュがあることにも注意してください。このチュートリアルに適したグループとセットアップポリシーファイルの例は、セットアップのチュートリアルに示されていますが、次にも示しておきます。
Setup
プログラムからの出力は、次のようになります。
Activation group descriptor registered. Activation descriptor registered. Stub bound in registry.
正常に DoesNotExtendActivatable
実装の起動記述子を登録したら、クライアントプログラムを実行できるようになります。クライアントプログラムは、最初の実行時に起動可能なオブジェクトを起動します。
クライアントプログラムは、「アクティベーションの使用: Activatable
を拡張する」チュートリアルで説明されているものと同じです。詳細は、そのチュートリアルの次のセクションを参照してください。