RMI createRegistry延迟问题

时间:2010-12-07 00:54:30

标签: java registry rmi

我遇到了一个奇怪且间歇性的问题,即在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正在启动某种工作线程,该线程会在一段时间后抛出异常?发生了什么事?

狼狈,
开发

2 个答案:

答案 0 :(得分:0)

使'registry'变量成为静态成员。目前它正在被垃圾收集,它会取消它,并允许服务器进行DGC,这允许进程退出。

您不需要执行/ while循环。使用Registry.REGISTRY_PORT。这就是它的用途。在IANA为RMI注册管理机构保留。

答案 1 :(得分:-1)

在JVM中使用LocateRegistry.createRegistry时,建议使用

final Registry registry = LocateRegistry.createRegistry(port);