我遇到了一个奇怪且间歇性的问题,即在JVM中创建RMI注册表。此代码将全部在Intranet上运行,其目的是能够轻松地在一堆计算机上启动服务。
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正在启动某种工作线程,该线程会在一段时间后抛出异常?发生了什么事?
狼狈,
开发
答案 0 :(得分:0)
使'registry'变量成为静态成员。目前它正在被垃圾收集,它会取消它,并允许服务器进行DGC,这允许进程退出。
您不需要执行/ while循环。使用Registry.REGISTRY_PORT。这就是它的用途。在IANA为RMI注册管理机构保留。
答案 1 :(得分:-1)
在JVM中使用LocateRegistry.createRegistry时,建议使用
final Registry registry = LocateRegistry.createRegistry(port);