Первый случай работает нормально, если 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 (), - это имена тех же типов, которые вы указали бы для одного из других методов.