Activatableを拡張しないこのチュートリアルでは、起動可能なリモート・オブジェクトを実装する方法について説明しますが、リモート・オブジェクトの実装でjava.rmi.activation.Activatableクラスを拡張しないという点で、「アクティベーションの使用: Activatableを拡張する」チュートリアルとは異なります。 この実装では、Activatableクラスのstaticメソッドを使って、起動可能なリモート・オブジェクトをエクスポートします。 このチュートリアルでは、Setupプログラム(「アクティベーションの使用: Setupプログラム」チュートリアルを参照)を使用します。このプログラムは、起動可能なリモート・オブジェクトに関する情報をJava Remote Method Invocation (Java RMI)起動システム・デーモン(rmid)に登録し、rmiregistryでそのリモート・オブジェクトのスタブをバインドして、クライアントが検索できるようにします。 この前に、そのチュートリアルを読むことをお薦めします。
このチュートリアルでは、次のステップを実行します。
このチュートリアルの実行に必要なファイルは、次のとおりです。
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を拡張する」チュートリアルで説明されているものと同じです。 詳細は、そのチュートリアルの次のセクションを参照してください。