これは可能ですか?(Java 6 を想定)
私の要点を説明するために考案された/単純化された例は次のとおりです。
- 明確に定義された、決して変更されない RMI インターフェイス (単一の JAR ファイル、テンプレート パラメーターなし) があります。
- ホスト X で実行されている RMIRegistry。
- ホスト Y から (ホスト X 上の RMIRegistry) に registry.rebind() する RMI サービス。と
- ホスト Z から RMI 呼び出しを実行する RMI クライアント
可能であれば、RMI サービス (ホスト Y のプロセス) でプロパティ "java.rmi.server.codebase" を指定するにはどうすればよいですか?
ホスト A と B が同じマシンである場合、この構成は「java.rmi.server.codebase」が「file:///C:/rmiCodebase/myCommonInterface.jar」のときに機能します。
ホスト A と B が別々のマシンにある場合、再バインド時に次の例外が発生します (ホスト Y に同じ「java.rmi.server.codebase」が設定されています)。
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException:
ホスト A と B が別々のマシンにあり、インターフェース JAR を Web サーバー経由で使用できるようにする場合 (「java.rmi.server.codebase」は「http://Y/rmiCodebase/myCommonInterface.jar」または「 http://Z/rmiCodebase/myCommonInterface.jar")、再バインド時にこのわずかに異なるエラーが発生します。
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.AccessException: Registry.Registry.rebind disallowed; origin /10.0.190.25 (host Y) is non-local host
私は少し混乱しています - すべての RMI サービスが RMIRegistry と同じ物理ホスト上で実行されなければならない場合、非常に制約があるようです (私が成功したのはこれだけです)
結局のところ、私はマシン Z がマシン Y で実行されているサービスに対して RMI 呼び出しを行えるようにしたいだけです。マシン Y と Z の両方で実行されているプロセスに myCommonInterface.jar を提供しています。マシン X が共通の (リモート) インターフェースを使って何かをしなければならないようにしたい!
次のリンクは役に立ちますが、この質問への回答には役立ちません: http://download.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html