RMI создать проблему задержки Registry - PullRequest
0 голосов
/ 07 декабря 2010

Я испытываю странную и периодически возникающую проблему при создании реестра 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 запускает какой-то рабочий поток, который через некоторое время выдает исключение?Что происходит?

сбит с толку,
Дев

Ответы [ 2 ]

0 голосов
/ 07 декабря 2010

При использовании LocateRegistry.createRegistry в JVM рекомендуется использовать

final Registry registry = LocateRegistry.createRegistry(port);
0 голосов
/ 07 декабря 2010

Сделать переменную 'registry' статическим членом. В данный момент он собирается для сбора мусора, который не экспортирует его, и позволяет серверу выполнять DGC'd, что позволяет процессу завершиться.

Вам не нужен этот цикл do / while. Используйте Registry.REGISTRY_PORT. Вот для чего это. Зарезервировано в IANA для Реестра RMI.

...