2010-12-07 101 views
0

我在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正在启动一段时间后会引发异常的工作线程?这是怎么回事?

狼狈,
开发

回答

0

充分利用 '登记' 系统变量的静态成员。目前正在进行垃圾收集,并取消了它,并允许服务器进行DGC'd,这允许进程退出。

你不需要做/ while循环。使用Registry.REGISTRY_PORT。这就是它的目的。在IANA为RMI注册处保留。

+0

啊哈!好的!我没有把它做成静态的,而是最终决定的。这解决了它。谢谢一堆! – dgorur 2010-12-07 02:04:45

+0

我仍然需要端口号,因为端口1099上可能存在其他RMI注册表。 – dgorur 2010-12-07 02:06:06

-1

当使用JVM内LocateRegistry.createRegistry,它建议使用

final Registry registry = LocateRegistry.createRegistry(port);