Я испытываю странную и периодически возникающую проблему при создании реестра RMI из JVM.Этот код будет выполняться в интрасети, и идея состоит в том, чтобы иметь возможность легко запускать службы на нескольких машинах.
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);
}
Конечно, существует очень простой основной метод:
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 запускает какой-то рабочий поток, который через некоторое время выдает исключение?Что происходит?
сбит с толку,
Дев