2

RMI インターフェイスをエクスポートするサービスがいくつかあります。

以前は、独自のレジストリを作成し ( を使用LocateRegistry.createRegistry)、そこにバインドすることでこれを提供していました。ただし、サービスが同じ VM (Tomcat) で別のアプリケーションとして実行されるように移動された場合、何らかの理由で 1 つのレジストリしか存在できないため、これは不可能になりました。

すべてのサービスに中央レジストリを使用することで、この問題を回避しました。それでも、レジストリのマルチオブジェクト レジストリの役割にはあまり興味がありません。エントリ ポイントの機能だけに興味があります。ただし、中央レジストリはより複雑になります (たとえば、最初に開始する必要があり、登録するサービスのインターフェイスが必要です)。

各サービスが RMI インターフェイスへのエントリ ポイントを個別に提供し、それらを同じ VM で実行するという状況を元に戻す方法はありますか (これはホスティングの詳細であり、設計の一部ではありません)。

4

3 に答える 3

0

すでに同様の質問をしたことを忘れていました (別の理由で、サービスを 1 つの VM にまとめて移動する前に、コードを削減するため)。最初の回答は、レジストリを回避する方法を示唆しています。

UnicastRemoteObject を使用し、オブジェクトのエクスポート時に取得したスタブをシリアル化し、共有ファイル、ソケット、またはスニーカーネットを使用して、クライアントがスタブを使用できるようにします。

于 2012-07-09T16:43:09.053 に答える
0

レジストリには固定の RMI オブジェクト ID があるため、JVM ごとに複数のレジストリを持つことはできません。次のように起動するようにすべてのサーバーを調整するだけです。

static Registry registry;
// ...
try
{
  registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
}
catch (...) // whatever the exception is, probably ExportException
{
  registry = LocateRegistry.locateRegistry(Registry.REGISTRY_PORT);
}
registry.rebind(...); // etc

次に、最初に開始した方がレジストリを開始し、他の人がそれを使用します。

于 2012-07-09T23:37:44.293 に答える