0

rmiでリモートオブジェクトのホストアドレスを設定したい。このIPアドレスをスタブに設定することは可能ですか?

注:ThreadLocalRmiClientSocketファクトリを使用してトリックを作成できることは知っていますが、使用したくありません。

4

2 に答える 2

1

リモートスタブ内で、保護されたRemoteRefrefフィールドに新しい値を設定する必要があります。すべてのリモート通信はこのオブジェクトを通過します。フィールドは保護されているため、これはRMIスタブから派生した独自のクラスでのみ実行できます。

残念ながら、RemoteRefはパブリック実装のないインターフェースです。既存のOpenJDK実装を調べることができます。そこから、を必要とする実装sun.rmi.server.UnicastRefとが必要な実装があることがLiveRefわかりEndpointます。Endpointすでに比較的簡単に理解できるクラスです。これらのクラスの機能をコードに複製する必要がある場合があります。

スタブクラスが実際に存在することを確認するには、rmicを使用して生成します-keepgenerated。また、特定の実装の詳細を知っているフィールドが存在することをソースコードでチェックできるようにするために使用することもできます。

一般的に、これは決してエレガントで簡単な解決策ではありませんが、機能するはずです。

拡張:これはすべて行うのがかなり複雑に見えるので、代わりに、リモートサービスの更新された場所を指す新しい有効なスタブを取得し、refそこからフィールドの値を盗むことを提案します。これは比較的簡単に実行できるようであり、現在のスタブが一部のデータ構造に絡まっていて、簡単に置き換えることができない場合は妥当な場合があります。スタブ自体は、リモート側が同じリモートコントラクトを実装し続ける限り、ホスト、ポート、オブジェクトID、またはワットを気にしRemoteRefません。スタブはRemoteRef.invokeに依存しています。

于 2013-01-27T14:38:51.983 に答える
-2

リモートオブジェクトをエクスポートする前に、サーバーJVMでシステムプロパティ「java.rmi.server.hostname」を適切に設定する必要があります。次に、その値は、エクスポート時に作成されるときにスタブに埋め込まれます。

于 2013-01-27T22:11:58.017 に答える