アクティベーションの使用:
           | 
ドキュメントの目次 | 
このチュートリアルでは、リモートオブジェクトの起動記述子を JavaTM Remote Method Invocation (Java RMI) 起動システムデーモン (rmid) に登録し、rmiregistry でそのリモートオブジェクトのスタブをバインドしてクライアントが検索できるようにするプログラムの記述方法について説明します。 
このチュートリアルでは、次の手順を実行します。
このチュートリアルの実行に必要なファイルは、次のとおりです。Setup.java - メイン Setup プログラム setup.policy - Setup プログラムのセキュリティーポリシーファイル rmid.policy - rmid のセキュリティーポリシーファイル group.policy - 起動グループのセキュリティーポリシーファイル Setup プログラムの実装
examples.activation.Setupクラスにより実装されるSetupプログラムは、起動記述子をrmidに登録して、その起動記述子によって指定されるオブジェクトの将来のアクティベーションを可能にします。このプログラムではリモートオブジェクトのインスタンスは生成されませんが、代わりにリモートオブジェクトのスタブをrmiregistryに登録して、クライアントが検索できるようにします。このSetupプログラムは、アクティベーションに関するほかのチュートリアルで説明されているどのクライアントを実行するよりも前に実行する必要があります。
Setupプログラムでは、多くのシステムプロパティーを使用して、rmidとrmiregistryに登録されている情報をカスタマイズします。また、このプログラムでは、登録されている起動可能なリモートオブジェクトの実装クラスのパッケージ修飾された名前を指定する、単一コマンド行の引数を取ります。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説明
- classpath は、
 Setupプログラムと実装クラスを含むクラスパス- setup.policy は、
 Setupプログラムのセキュリティーポリシーファイル- codebase は、リモートインタフェースクラスの場所 (URL)
 - setupCodebase は、
 Setupプログラムのクラスの場所 (URL) (setup.policy ファイル内のSetupプログラムへのアクセス権の付与に使用)- implCodebase は、実装クラスの場所 (URL) であり、起動記述子内で、またグループポリシーファイル内でアクセス権を付与するためのコードベースとして使用される
 - name は、レジストリ内でバインドされるオブジェクトのスタブの名前
 - file (オプション) は、オブジェクトの起動記述子に data として登録されているオブジェクトの持続状態が書かれたファイルの名前 (デフォルト値: なし)
 - group.policy (オプション) は、起動グループのセキュリティーポリシーファイル (デフォルトで
 group.policy)- 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プログラムには、以下のアクセス権が必要です。
java.util.PropertyPermission-Setupプログラムが必要とするさまざまなシステムプロパティーを読み取るjava.net.SocketPermission- 起動システム (ポート1098) に接続して起動記述子を登録し、また、レジストリ (ポート1099) に接続して起動可能なオブジェクトのスタブを名前にバインドするこの
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- グループのセキュリティーポリシーファイルjava.class.path- 起動グループがローカルのクラスパスから実装クラスをロードしないようにするダミーのクラスパスexamples.activation.impl.codebase- グループのポリシーファイルがアクセス権を付与するのに使用する実装クラスの場所examples.activation.file- オブジェクトの持続状態が書かれたファイル
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 つのアクセス権が必要です。
java.io.FilePermission- 起動可能なオブジェクトの持続状態を含むファイルの読み書きを行うjava.net.SocketPermission- 起動可能なオブジェクトをエクスポートして、匿名ポートの接続を受け入れるグループ記述子の登録
次に、Setupプログラムは、起動グループ記述子を起動システムに登録して、java.rmi.activation.ActivationGroupIDクラスのインスタンスであるそのグループの ID を取得する必要があります。java.rmi.activation.ActivationGroupクラスには、その起動システムのスタブを取得するための static メソッドgetSystemがあります。Setupプログラムは、起動システムのリモートメソッドregisterGroupを呼び出し、上記で作成したグループ記述子を渡して、起動グループを登録します。ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupDesc);起動記述子の構築
起動グループ識別子が取得されると、
Setupプログラムでは、起動記述子を登録できるようになります。起動記述子には、以下の 4 つの基本的な情報が含まれます。
- オブジェクトが含まれることになるグループの起動グループ識別子
 - 実装クラスの名前
 - 実装クラスのロード元を指定する場所 (URL)
 - オブジェクトの初期化情報を含む整列化されたオブジェクト
 この例では、起動グループ識別子は上記で取得した識別子になっています。 実装のクラス名は 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);
この例のソースファイルは、次のようにしてコンパイルできます。
setupDir は、クラスファイルを配置するルートデスティネーションディレクトリです。javac -d setupDir Setup.java
rmid、rmiregistry、および 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.policy は、
 rmidのセキュリティーポリシーファイル- group.policy は、グループポリシーファイルで、
 rmidのポリシーファイルで使用される
rmidのセキュリティーポリシーファイルは、起動グループ VM の起動時に、rmidが特定のコマンドを実行し、特定のコマンド行オプションを使用するアクセス権を付与します。たとえば、ユーザーは、1 つまたは複数のシステムプロパティー、またはほかのjavaコマンド行オプションを使用して、起動グループ VM を起動する特定のアクセス権を付与することができます。この例では、rmidがシステムプロパティーjava.security.policy、java.class.path、examples.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説明
- setupDir は、
 Setupプログラムのクラスのルートディレクトリ- implDir は、実装のクラスのルートディレクトリ
 - setup.policy は、
 Setupプログラムのセキュリティーポリシーファイル- codebase は、リモートインタフェースクラスの場所 (URL)
 - setupCodebase は、
 Setupプログラムのクラスの場所 (URL) (setup.policy ファイル内のSetupプログラムへのアクセス権の付与に使用)- implCodebase は、実装クラスの場所 (URL) であり、起動記述子内で、またグループポリシーファイル内でアクセス権を付与するためのコードベースとして使用される
 - name は、レジストリ内でバインドされるオブジェクトのスタブの名前
 - file (オプション) は、オブジェクトの起動記述子に
 dataとして登録されているオブジェクトの持続状態が書かれたファイルの名前 (デフォルト値: なし)- group.policy (オプション) は、起動グループのセキュリティーポリシーファイル (デフォルトで
 group.policy)- implClass は、実装クラスの完全指定の名前
 注 -上記のいずれかのコードベースのファイル URL を使用する場合は、各ファイル URL の末尾にスラッシュがあることを確認してください。 末尾にスラッシュがない場合、コードベースは無効になります。
Setupプログラムからの出力は、次のようになります。Activation group descriptor registered. Activation descriptor registered. Stub bound in registry.
| 
Copyright© 2006 Sun Microsystems, Inc.All Rights Reserved. コメントの送付先:rmi-comments@java.sun.com  | 
 Java Software  |