アクティベーションの使用: | 
ドキュメントの目次 | 
このチュートリアルでは、java.rmi.activation.Activatable クラスを拡張することで起動可能なリモートオブジェクトを実装する方法について説明します。このチュートリアルでは、Setup プログラム (「アクティベーションの使用:Setup プログラム」チュートリアルを参照) を使用します。 このプログラムは、起動可能なリモートオブジェクトに関する情報を JavaTM Remote Method Invocation (Java RMI) 起動システムデーモン (rmid) に登録し、rmiregistry でそのリモートオブジェクトのスタブをバインドして、クライアントが検索できるようにします。このチュートリアルの前に、Setup プログラムのチュートリアルを読むことをお勧めします。
このチュートリアルでは、次の手順を実行します。
このチュートリアルの実行に必要なファイルは、次のとおりです。
MyRemoteInterface.java - 単純なリモートインタフェース ExtendsActivatable.java - リモートインタフェースの「起動可能な」実装Client.java - リモートインタフェースを使用するクライアントclient.policy - クライアントのセキュリティーポリシーファイル 起動可能なリモートオブジェクトを実装するには、いくつかの基本的な方法があります。このチュートリアルでは、構築中に起動可能なリモートオブジェクトをエクスポートする
java.rmi.activation.Activatableクラスを拡張することで起動可能なリモートオブジェクトを実装する方法について説明します。リモートオブジェクトは、クライアントが起動可能なリモートオブジェクトのスタブでリモートメソッドを呼び出すときに起動されます。起動可能なリモートオブジェクトのスタブには、リモートオブジェクトの起動識別子と、そのリモートオブジェクトの 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.ExtendsActivatable実装クラスは次のとおりです。package examples.activation; import java.rmi.*; import java.rmi.activation.*; public class ExtendsActivatable extends Activatable implements MyRemoteInterface { public ExtendsActivatable(ActivationID id, MarshalledObject data) throws RemoteException { super(id, 0); } public Object remoteMethod(Object obj) { return obj; } }
ExtendsActivatableクラスは、Activatableクラスを拡張して、リモートインタフェースMyRemoteInterfaceを実装します。
ExtendsActivatableクラスは、起動グループが起動プロセス中にインスタンスを構築するために呼び出す特別な起動コンストラクタを宣言します。この特別なコンストラクタは、次の 2 つのパラメータを取ります。
- 1 つ目のパラメータは
 ActivationIDで、起動可能なリモートオブジェクトの識別子です。アプリケーションが起動記述子をrmidに登録すると、rmidはそれに起動識別子を割り当て、この起動識別子が記述子に関連する情報を参照します。リモートオブジェクトが起動されると、この同じ起動識別子 (リモートオブジェクトのスタブにも含まれている) がコンストラクタに渡されます。- 2 つ目のパラメータは
 MarshalledObjectで、rmidにあらかじめ登録された初期化データが含まれています。この初期化データには、たとえば、オブジェクトの持続状態が書かれたファイル名などがあります。この例では、リモートオブジェクトを構築する初期化データは必要ありません。コンストラクタは、単純にスーパークラス (
Activatable) のコンストラクタを呼び出して、匿名ポートにオブジェクトをエクスポートします。最後に、クラスは、リモートインタフェースの単一メソッドである
remoteMethodを実装して、引数として渡されたオブジェクトを返します。
Clientプログラムは、オプションの第 1 引数として提供されたホストのレジストリ内のリモートオブジェクトのスタブ (リモートインタフェースMyRemoteInterfaceを実装するスタブ) を検索して、そのスタブのremoteMethodメソッドを呼び出します。レジストリから獲得したスタブでこのクライアントがリモートメソッドを呼び出すと、リモートオブジェクトが起動されていない場合にはリモートオブジェクトが起動されます。プログラムのソースは以下のとおりです。
package examples.activation; import java.rmi.*; import java.rmi.registry.*; public class Client { public static void main(String args[]) throws Exception { String hostname = "localhost"; if (args.length < 1) { System.err.println( "usage: java [options] examples.activation.Client <hostname>"); System.exit(1); } else { hostname = args[0]; } if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } String name = System.getProperty("examples.activation.name"); Registry registry = LocateRegistry.getRegistry(hostname); MyRemoteInterface stub = (MyRemoteInterface) registry.lookup(name); System.err.println("Obtained stub from the registry."); System.err.println("Invoking remote method..."); String result = (String) stub.remoteMethod("hello there!"); System.err.println("Returned from remote call."); System.err.println("Result: " + result); } }このプログラムを次のように実行します。
java -cp clientDir \ -Djava.security.policy=client.policy \ -Dexamples.activation.client.codebase=clientCodebase \ -Dexamples.activation.name=name \ examples.activation.Client [host]説明
- clientDir は、クライアントプログラム (そのクラスパス) のルートディレクトリ
 - client.policy は、このプログラムのセキュリティーポリシーファイル
 - clientCodebase は、このプログラムのクラス (client.policy ファイルでこのプログラムにアクセス権を付与するときに使用) の場所 (URL)
 - name は、レジストリ内のオブジェクトのスタブの名前
 - host は、サーバーのホスト
 注:このプログラムを実行する前に、
rmidがそのデフォルトポートで稼動し、rmiregistryがそのデフォルトポート (両方ともリモートホスト上) で稼動している必要があります。アクティベーションの例として、適切なアクセス権を付与する
client.policyファイルの例を以下に示します。grant codeBase "${examples.activation.client.codebase}" { // permissions to read system properties required by the client permission java.util.PropertyPermission "examples.activation.name","read"; // permission to connect to the registry, activation system, and remote host permission java.net.SocketPermission "*:1024-","connect"; };アクセス権が付与されるコードベースは、クライアントのクラスの場所を指定するファイル URL です。このファイル URL は、
examples.activation.client.codebaseシステムプロパティーの値で、クライアントプログラムの実行時に定義されます。クライアントには 2 つのアクセス権が必要です。
java.util.PropertyPermission- レジストリ内のスタブの名前を指定するシステムプロパティーexamples.activation.nameを読み取るjava.net.SocketPermission- レジストリ、起動システム、およびリモートオブジェクトのホストに接続する
この例のソースファイルは、次のようにしてコンパイルできます。
javac -d implDir MyRemoteInterface.java ExtendsActivatable.java javac -d clientDir MyRemoteInterface.java Client.javaimplDir は実装のクラスファイルを配置する生成先ディレクトリで、clientDir はクライアントのクラスファイルを配置する生成先ディレクトリです。
Setup プログラムの実行実装段階が完了したら、起動可能なオブジェクトに関する情報を登録して、クライアントが使えるようにする必要があります。
Setupプログラムは、「アクティベーションの使用:Setupプログラム」チュートリアルで説明されているように、起動可能なオブジェクトの起動記述子をrmidに登録し、rmiregistryでリモートオブジェクトのスタブをバインドして、クライアントが検索できるようにします。この例の
Setupプログラムを実行するには、Setup プログラムのチュートリアルの「rmid、rmiregistry、およびSetupプログラムの起動」を参照してください。rmid、rmiregistry、およびSetupプログラム自体の起動方法について説明しています。
Setupチュートリアルの手順に従ってrmidとrmiregistryを実行したら、Setupプログラムを実行して、examples.activation.ExtendsActivatableクラスを実装する起動可能なオブジェクトの起動記述子を登録する必要があります。次のコマンド行では、Setupプログラムを実行して、使用される各コードベースの適切なファイル URL を提供します。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.ExtendsActivatable説明
- setupDir は、
 Setupプログラムのクラスのルートディレクトリ- implDir は、実装のクラスのルートディレクトリ
 - setup.policy は、
 Setupプログラムのセキュリティーポリシーファイル- group.policy は、起動グループのセキュリティーポリシーファイル
 
examples.activation.fileシステムプロパティーは、ExtendsActivatable実装クラスでは使用しないため、指定する必要はありません。前述の各ファイル URL には、必須の末尾のスラッシュがあることに注意してください。このチュートリアルに適したグループとセットアップポリシーファイルの例は、セットアップのチュートリアルに示されていますが、以下にも示しておきます。
Setupプログラムからの出力は、次のようになります。Activation group descriptor registered. Activation descriptor registered. Stub bound in registry.
正常に
ExtendsActivatable実装の起動記述子を登録したら、クライアントプログラムを実行できるようになります。 クライアントプログラムは、最初の実行時に起動可能なオブジェクトを起動します。次のコマンド行では、クライアントコードベースのファイル URL を指定するクライアントプログラムの実行方法を示します。
java -cp clientDir \ -Djava.security.policy=client.policy \ -Dexamples.activation.client.codebase=file:/clientDir/ \ -Dexamples.activation.name=examples.activation.MyRemoteInterface \ examples.activation.Client [host]説明
- clientDir は、クライアントプログラム (そのクラスパス) のルートディレクトリ
 - client.policy は、このプログラムのセキュリティーポリシーファイル
 - name は、レジストリ内のオブジェクトのスタブの名前
 - host は、サーバーのホスト
 注 -
- クライアントコードベースには、末尾にスラッシュが必要です。
 - name は、
 Setupプログラムに提供される名前と一致する必要があります。この例では、examples.activation.MyRemoteInterfaceという名前を使用しました。rmidとrmiregistryは、サーバーのホスト上で稼動している必要があります。サーバーのホストがローカルホストでない場合、host 引数は、それらが稼動しているリモートホストを指定する必要があります。クライアントからの出力は、次のようになります。
Obtained stub from the registry. Invoking remote method... Returned from remote call. Result: hello there!
| 
Copyright© 2006 Sun Microsystems, Inc.All Rights Reserved. コメントの送付先:rmi-comments@java.sun.com  | 
 Java Software  |