我在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);
}
当然有一个很简单的主要方法:
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正在启动一段时间后会引发异常的工作线程?这是怎么回事?
狼狈,
开发
啊哈!好的!我没有把它做成静态的,而是最终决定的。这解决了它。谢谢一堆! – dgorur 2010-12-07 02:04:45
我仍然需要端口号,因为端口1099上可能存在其他RMI注册表。 – dgorur 2010-12-07 02:06:06