Java

アクティベーションの使用: Setup プログラム

ドキュメントの目次

このチュートリアルでは、リモートオブジェクトの起動記述子を JavaTM Remote Method Invocation (Java RMI) 起動システムデーモン (rmid) に登録し、rmiregistry でそのリモートオブジェクトのスタブをバインドしてクライアントが検索できるようにするプログラムの記述方法について説明します。

このチュートリアルでは、次の手順を実行します。

このチュートリアルの実行に必要なファイルは、次のとおりです。

Setup プログラムの実装

examples.activation.Setup クラスにより実装される Setup プログラムは、起動記述子を rmid に登録して、その起動記述子によって指定されるオブジェクトの将来のアクティベーションを可能にします。このプログラムではリモートオブジェクトのインスタンスは生成されませんが、代わりにリモートオブジェクトのスタブを rmiregistry に登録して、クライアントが検索できるようにします。この Setup プログラムは、アクティベーションに関するほかのチュートリアルで説明されているどのクライアントを実行するよりも前に実行する必要があります。

Setup プログラムでは、多くのシステムプロパティを使用して、rmidrmiregistry に登録されている情報をカスタマイズします。また、このプログラムでは、登録されている起動可能なリモートオブジェクトの実装クラスのパッケージ修飾された名前を指定する、単一コマンド行の引数を取ります。Setup プログラムは次のように実行します。

java -cp classpath \
-Djava.security.policy=setup.policy        \
-Djava.rmi.server.codebase=codebase         \
-Dexamples.activation.setup.codebase=setupCodebase  \
-Dexamples.activation.impl.codebase=implCodebase \
-Dexamples.activation.name=name             \
[-Dexamples.activation.file=filename]       \
[-Dexamples.activation.policy=group.policy] \
examples.activation.Setup implClass

説明

Setup プログラムのポリシーファイルの例を以下に示します。

grant codeBase "${examples.activation.setup.codebase}" {

// permissions to read system properties required by setup program
permission java.util.PropertyPermission "examples.activation.impl.codebase","read";
permission java.util.PropertyPermission "examples.activation.policy","read";
permission java.util.PropertyPermission "examples.activation.file","read";
permission java.util.PropertyPermission "examples.activation.name","read";

// permission to connect to the activation system and the registry
permission java.net.SocketPermission "*:1098-1099","connect";
};

アクセス権が付与されるコードベースは、Setup プログラムの実装クラスの場所を指定する URL です。この URL は、examples.activation.setup.codebase システムプロパティの値で、Setup プログラムの実行時に定義されます。Setup プログラムには、以下のアクセス権が必要です。

この Setup プログラムは、以下のようなステップで記述します。

Setup クラスには、上記のすべてのステップを実行する static メソッド main があります。ステップを実行する前に、main メソッドは、SecurityManager を設定して、起動可能なリモートオブジェクトの実装クラスのパッケージ修飾された名前を指定する単一コマンド行の引数を取得します。残りのステップについては、以下のセクションを参照してください。完全なソースコードについては、Setup.java を参照してください。

起動グループ記述子の構築

アプリケーションで特定の起動可能なリモートオブジェクトの情報を登録する前に、そのオブジェクトが含まれることになる「起動グループ」に関する情報を登録する必要があります。起動グループは、起動可能なオブジェクトのセットのコンテナ仮想マシン (VM) です。各起動グループでは、1 つまたは複数の起動可能なオブジェクトの実行を管理します。起動グループ記述子 には、起動システムが起動グループの VM を起動するのに必要な情報が含まれます。アプリケーションでは、起動グループ記述子を起動システム rmid に登録して、その起動可能なオブジェクトに使用する起動グループ識別子を取得できます。または、前のグループ登録から取得した起動グループ識別子を使うことができます。

java.rmi.activation.ActivationGroupDesc クラスのインスタンスである起動グループ記述子は、いくつかの方法で構築できます。このチュートリアルでは、パラメータが 2 つのコンストラクタ ActivationGroupDesc(Properties,CommandEnvironment) を使用します。Properties マップには、起動グループ VM のシステムプロパティのオーバーライドが含まれています。このチュートリアルでは、起動グループ VM で以下のシステムプロパティを定義する必要があります。

java.security.policy プロパティは、examples.activation.policy システムプロパティにより指定され、デフォルトでは group.policy という名前のファイルです。このファイルは、実際には、rmid が実行される作業ディレクトリにあります。java.class.path プロパティは、no_classpath として定義されます。examples.activation.impl.codebase および examples.activation.file プロパティは、それぞれ現在の値により指定され、Setup プログラムの実行時に定義されます。

グループ記述子は以下のように構成されています。

String policy =
System.getProperty("examples.activation.policy", "group.policy");
String implCodebase =
System.getProperty("examples.activation.impl.codebase");
String filename =
System.getProperty("examples.activation.file", "");

Properties props = new Properties();
props.put("java.security.policy", policy);
props.put("java.class.path", "no_classpath");
props.put("examples.activation.impl.codebase", implCodebase);
if (filename != null && !filename.equals("")) {
props.put("examples.activation.file", filename);
}

ActivationGroupDesc groupDesc = new ActivationGroupDesc(props, null);

アクティベーションの例として、適切なアクセス権を付与する group.policy ファイルの例を以下に示します。

grant codeBase "${examples.activation.impl.codebase}" {
    
// permission to read and write object's file
permission java.io.FilePermission "${examples.activation.file}","read,write";
    
// permission to listen on an anonymous port
permission java.net.SocketPermission "*:1024-","accept";
};

アクセス権が付与されるコードベースは、起動可能なオブジェクトの実装クラスの場所を指定する URL です。この URL は、examples.activation.impl.codebase システムプロパティの値で、起動グループの VM で定義されます。グループ内の起動可能なオブジェクトには、2 つのアクセス権が必要です。

グループ記述子の登録

次に、Setup プログラムは、起動グループ記述子を起動システムに登録して、java.rmi.activation.ActivationGroupID クラスのインスタンスであるそのグループの ID を取得する必要があります。java.rmi.activation.ActivationGroup クラスには、その起動システムのスタブを取得するための static メソッド getSystem があります。Setup プログラムは、起動システムのリモートメソッド registerGroup を呼び出し、上記で作成したグループ記述子を渡して、起動グループを登録します。
ActivationGroupID groupID = 
ActivationGroup.getSystem().registerGroup(groupDesc);

起動記述子の構築

起動グループ識別子が取得されると、Setup プログラムでは、起動記述子を登録できるようになります。起動記述子には、以下の 4 つの基本的な情報が含まれます。

この例では、起動グループ識別子は上記で取得した識別子になっています。実装のクラス名は implClass というクラス名で、Setup プログラムへのコマンド行引数として提供されます。場所 (URL) は、システムプロパティ examples.activation.impl.codebase により指定されます。初期化データ (オプション) は、システムプロパティ examples.activation.file により指定されるファイル名です。

起動記述子は以下のように構成されています。

MarshalledObject data = null;
if (filename != null && !filename.equals("")) {
data = new MarshalledObject(filename);
}

ActivationDesc desc =
new ActivationDesc(groupID, implClass, implCodebase, data);

起動記述子の登録

次に、Setup プログラムでは、起動記述子を起動システムに登録する必要があります。Activatable クラスには、簡易 static メソッド register があります。このメソッドは、起動記述子を起動システムに登録して、その記述子により指定される起動可能なオブジェクトのスタブを返します。

Remote stub = Activatable.register(desc);

: register メソッドは、スタブインスタンスを作成するために、実装クラスのスタブクラスをロードしようとします。起動可能なオブジェクトが 5.0 より前のバージョンのクライアントをサポートする必要がある場合は、rmic を使用して、実装クラスのスタブクラスを事前に生成する必要があります。起動可能なオブジェクトが 5.0 より前のバージョンのクライアントをサポートする必要がない場合は、実装クラスのスタブクラスを事前に生成する必要はありません。register メソッドが事前に生成されたスタブクラスをロードできない場合は、実装クラスのすべてのインスタンスを実装する、動的に生成されたプロキシクラスのインスタンスを使用します。後者の場合、register メソッドは、実装クラスが実装するリモートインタフェースを決定するために、実装クラスをロードする必要があります。そのため、事前に生成されたスタブクラスを使用するか、動的に生成されたスタブクラスを使用するかによって、register メソッドの動作にわずかな違いが生じます。

rmiregistry でのリモートオブジェクトのスタブのバインド

最後に、リモートオブジェクトのスタブを、デフォルトの 1099 ポートで実行中のレジストリ内の名前にバインドします。名前は、システムプロパティ examples.activation.name により指定されます。

String name = System.getProperty("examples.activation.name");
LocateRegistry.getRegistry().rebind(name, stub);

ソースファイルのコンパイル

この例のソースファイルは、次のようにしてコンパイルできます。

javac -d setupDir Setup.java
setupDir は、クラスファイルを配置するルートデスティネーションディレクトリです。

rmidrmiregistry、および Setup プログラムの起動

この Setup プログラムを実行するには、次の操作を行う必要があります。

rmid の起動

rmid を起動するには、サーバのホストで rmid コマンドを実行します。このコマンドでは、以下のように指定したセキュリティポリシーファイルを使用して実行した場合は、何も出力されません。詳細は、rmid のツールドキュメント (Solaris 用、Windows 用) を参照してください。

Solaris オペレーティングシステムでの例:

rmid -J-Djava.security.policy=rmid.policy \
-J-Dexamples.activation.policy=group.policy &
	 

Windows プラットフォームでは、次のコマンドを実行します。

start rmid -J-Djava.security.policy=rmid.policy \
-J-Dexamples.activation.policy=group.policy

説明

rmid のセキュリティポリシーファイルは、起動グループ VM の起動時に、rmid が特定のコマンドを実行し、特定のコマンド行オプションを使用するアクセス権を付与します。たとえば、ユーザは、1 つまたは複数のシステムプロパティ、またはほかの java コマンド行オプションを使用して、起動グループ VM を起動する特定のアクセス権を付与することができます。この例では、rmid がシステムプロパティ java.security.policyjava.class.pathexamples.activation.impl.codebase、および examples.activation.file を定義する起動グループ VM を起動できるようになっています。次のセキュリティポリシーファイルの例では、これらの特定のプロパティを定義して、起動グループ VM を起動するアクセス権を付与しています。

grant {
// allow activation groups to use certain system properties
permission com.sun.rmi.rmid.ExecOptionPermission "-Djava.security.policy=${examples.activation.policy}";
permission com.sun.rmi.rmid.ExecOptionPermission "-Djava.class.path=no_classpath";
permission com.sun.rmi.rmid.ExecOptionPermission "-Dexamples.activation.impl.codebase=*";
permission com.sun.rmi.rmid.ExecOptionPermission "-Dexamples.activation.file=*";
};

最初の ExecOptionPermission アクセス権の付与では、java.security.policy システムプロパティを、rmid の実行時に定義されるシステムプロパティ examples.activation.policy により指定されるファイルに限定しています。次の権限付与では、グループがシステムプロパティ java.class.path を、グループが有効なクラスパスを持たないようにするダミーのクラスパス no_classpath として定義できるようにします。次の権限付与では、グループがシステムプロパティ examples.activation.impl.codebase を任意の値として定義できるようにします。最後の権限付与では、examples.activation.file システムプロパティを任意の値にできるようにします。

rmiregistry の起動

レジストリを起動するには、サーバのホストで rmiregistry コマンドを実行します。このコマンドからは成功時に何の出力もありません。通常、バックグラウンドで実行されます。詳細は、rmiregistry のツールドキュメント (Solaris 用、Windows 用) を参照してください。

Solaris オペレーティングシステムでの例:

rmiregistry &

Windows プラットフォームでは、次のコマンドを実行します。

start rmiregistry 

デフォルトでは、レジストリは TCP ポート番号 1099 で実行されます。別のポート上でレジストリを実行するには、コマンド行でポート番号を指定します。たとえば、Windows プラットフォーム上のポート 2001 でレジストリを起動するには、次のようにします。

start rmiregistry 2001

注: rmiregistry のクラスパスにはローカルのクラスパスからクラスをロードしないようにする実装クラスが何もないことを確認してください。

レジストリが 1099 以外のポートで実行される予定の場合は、Setup プログラム内、およびこのレジストリにアクセスするすべてのクライアント内の LocateRegistry.getRegistry の呼び出しに、ポート番号を指定する必要があります。たとえば、この例でレジストリをポート番号 2001 で実行する場合、getRegistry の呼び出しは次のようになります。

Registry registry = LocateRegistry.getRegistry(2001);

また、1099 以外のレジストリポートを使う場合は、Setup およびクライアントプログラムのポリシーファイルを変更して、そのレジストリのポートへの接続許可を与える必要もあります。

Setup プログラムの実行

Setup プログラムを起動するには、次の java コマンドを使用して Setup クラスを実行します。

java -cp setupDir:implDir \
-Djava.security.policy=setup.policy        \
-Djava.rmi.server.codebase=codebase         \
-Dexamples.activation.setup.codebase=setupCodebase       \
-Dexamples.activation.impl.codebase=implCodebase \
-Dexamples.activation.name=name             \
[-Dexamples.activation.file=file]       \
[-Dexamples.activation.policy=group.policy] \
examples.activation.Setup implClass

説明

注: 上記のいずれかのコードベースのファイル URL を使用する場合は、各ファイル URL の末尾にスラッシュがあることを確認してください。末尾にスラッシュがない場合、コードベースは無効になります。

Setup プログラムからの出力は、次のようになります。

Activation group descriptor registered.
Activation descriptor registered.
Stub bound in registry.

Copyright 2004 Sun Microsystems, Inc.All Rights Reserved.
コメントの送付先: rmi-comments@java.sun.com
Sun