JVM内からRMIレジストリを作成する際に奇妙で断続的な問題が発生しました。このコードはすべてイントラネット上で実行され、多数のマシン上で簡単にサービスを起動できるようにすることです。RMI createRegistry遅延問題
public static <X, Y> void newServer(Function<X, Y> function, String name)
throws Exception {
FunctionServer<X, Y> fun = null;
RemoteFunction<X, Y> stub = null;
Registry registry = null;
try {
fun = new FunctionServer<X, Y>(function);
stub = (RemoteFunction<X, Y>) UnicastRemoteObject.exportObject(fun, 0);
}
catch (RemoteException e1) {
e1.printStackTrace();
}
boolean foundPort = false;
int port = 1099;
do {
try {
registry = LocateRegistry.createRegistry(port);
registry.rebind(name, stub);
// Thread.sleep(100);
foundPort = true;
}
catch (ExportException e) {
port++;
}
catch (Exception e) {
e.printStackTrace();
throw e;
}
} while (!foundPort);
if (registry.lookup(name) != null)
System.out.println("Service " + name + " serving "
+ function.getClass().getCanonicalName() + " on port " + port);
}
非常に簡単なmainメソッドもちろんあります:
FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext(args[0]);
Object obj = context.getBean(args[1]);
if (obj instanceof Function<?, ?>) {
Function<?, ?> fun = (Function<?, ?>) obj;
FunctionServer.newServer(fun, args[2]);
}
次のようにコードは、コマンドラインから起動されます。
java -cp daopt.jar -Djava.rmi.server.codebase="file://daopt.jar" ****.*******.remote.FunctionServer spring/rosenbrockServer.xml rosenbrock rosenbrock
を時々、しかし、それは静かに失敗したが。サーバーの起動メッセージが正常に出力されますが、javaプロセスは実行されていません。netstat -anp | grep [portNumber]は何も表示しません。注目すべきは、newServerメソッドで遅れを取った場合、つまり行のコメントを外す場合
Thread.sleep(100);
すべてが正常に動作します。これは、LocateRegistry.createRegistryがしばらくしてから例外をスローする何らかの種類のワーカースレッドを起動していることを意味しますか?どうしたの?
Flummoxed、
のDev
アハを使用することをお勧めです!いいです!それを静的にするのではなく、私はそれを最終的にしました。それはそれを修正した。本当にありがとう! – dgorur
ポート番号が必要なのは、ポート1099に他のRMIレジストリがある可能性があるからです。 – dgorur
静的にします。私は理由を述べた。それを最終的にすることはそれらを修正しない。 – EJP