rmiでリモートオブジェクトのホストアドレスを設定したい。このIPアドレスをスタブに設定することは可能ですか?
注:ThreadLocalRmiClientSocketファクトリを使用してトリックを作成できることは知っていますが、使用したくありません。
rmiでリモートオブジェクトのホストアドレスを設定したい。このIPアドレスをスタブに設定することは可能ですか?
注:ThreadLocalRmiClientSocketファクトリを使用してトリックを作成できることは知っていますが、使用したくありません。
リモートスタブ内で、保護されたRemoteRefrefフィールドに新しい値を設定する必要があります。すべてのリモート通信はこのオブジェクトを通過します。フィールドは保護されているため、これはRMIスタブから派生した独自のクラスでのみ実行できます。
残念ながら、RemoteRefはパブリック実装のないインターフェースです。既存のOpenJDK実装を調べることができます。そこから、を必要とする実装sun.rmi.server.UnicastRef
とが必要な実装があることがLiveRef
わかりEndpoint
ます。Endpoint
すでに比較的簡単に理解できるクラスです。これらのクラスの機能をコードに複製する必要がある場合があります。
スタブクラスが実際に存在することを確認するには、rmicを使用して生成します-keepgenerated
。また、特定の実装の詳細を知っているフィールドが存在することをソースコードでチェックできるようにするために使用することもできます。
一般的に、これは決してエレガントで簡単な解決策ではありませんが、機能するはずです。
拡張:これはすべて行うのがかなり複雑に見えるので、代わりに、リモートサービスの更新された場所を指す新しい有効なスタブを取得し、ref
そこからフィールドの値を盗むことを提案します。これは比較的簡単に実行できるようであり、現在のスタブが一部のデータ構造に絡まっていて、簡単に置き換えることができない場合は妥当な場合があります。スタブ自体は、リモート側が同じリモートコントラクトを実装し続ける限り、ホスト、ポート、オブジェクトID、またはワットを気にしRemoteRef
ません。スタブはRemoteRef.invokeに依存しています。
リモートオブジェクトをエクスポートする前に、サーバーJVMでシステムプロパティ「java.rmi.server.hostname」を適切に設定する必要があります。次に、その値は、エクスポート時に作成されるときにスタブに埋め込まれます。