Разница между именованием и реестром в RMI - PullRequest
1 голос
/ 19 марта 2012

Я использовал

Naming.rebind("rmi://localhost:1099/RmiServer", c);

где c - удаленный объект. И

 XYZ robj=new XYZ();
 ABC stub = (ABC) UnicastRemoteObject.exportObject(robj, 0);
 Registry registry = LocateRegistry.getRegistry();
 registry.bind("RmiServer", stub);

где заглушка - удаленный объект.

Первый случай работает нормально, если rmiregistry уже запущен, но последний бросает ServerException that ClassNotFoundException выбрасывается для класса ABC. Куда я иду не так?

Кроме того, как обстоят дела с Naming and Registry different в том смысле, что здесь Naming привязывается к локальному хосту, тогда как позже динамически получает соответствующий порт и адрес, а затем привязывает объект к нему.

1 Ответ

3 голосов
/ 20 марта 2012

Первый случай работает нормально, если rmiregistry уже запущен, но позже выдает ServerException, что ClassNotFoundException выбрасывается для класса ABC.Где я иду не так?

У вас есть это спереди.Если вы используете отдельный rmiregistry, вы получите ClassNotFoundExceptions, если удаленные интерфейсы, заглушки и т. Д. Не включены в CLASSPATH rmiregistry.Если вы запустите Реестр в процессе через LocateRegistry.createRegistry(), что не может произойти, в противном случае экспорт завершился бы неудачей до bind().

Кроме того, чем отличаются Именование и Реестр в том смысле, что здесьИменование - это привязка к локальному хосту, тогда как позднее динамическое получение соответствующего порта и адреса, а затем привязка объекта к нему.

Naming предоставляет набор статических методов, которые взаимодействуют с Реестром без вашего участия.позвонить LocateRegistry.getRegistry().API очень похож, но строки имен отличаются: они основаны на URL.

В классе Naming все строки имен являются URL RMI, например, rmi: // localhost: 1099 /.Это верно для всех методов: bind (), rebind (), unbind (), lookup () и list ().

С интерфейсом Registry все строки имен являются просто строками, например.

Так что, если вы используете оба класса в разных частях кода, вам нужно придерживаться этого, чтобы обеспечить совместимость.Например, можно использовать URL-адреса в стиле Naming в интерфейсе реестра, они просто обрабатываются как строки, но тогда результаты Naming.list () будут выглядеть примерно так: rmi: // localhost: 1099 / rmi: // localhost: 1099 /,Так что не делайте этого.

В обоих случаях имена, которые вы возвращаете из list (), - это имена тех же типов, которые вы указали бы для одного из других методов.

...