Spec-Zone .ru
спецификации, руководства, описания, API
|
Оглавление
Поставщик услуг реестра RMI позволяет приложениям JNDI получать доступ к удаленным объектам, зарегистрированным в реестре RMI. Учитывая расположение реестра, провайдер создаст контекст именования с привязкой для объектов, зарегистрированных там. Такой контекст может быть ограничен в другое пространство имен JNDI-accessible (такое как LDAP, например). Ссылки на отдельные удаленные объекты могут аналогично быть связаны в другое пространство имен.
Ключевое преимущество ограничения контекстов реестра в другие пространства имен является независимым от расположения доступом к удаленным объектам: клиенты RMI не должны знать имя хоста реестра или номер порта. Серверы RMI могут использовать в своих интересах это, чтобы рекламировать их службы потенциальным клиентам. Кроме того, удаленные объекты могут быть соединены в тот же самый каталог предприятия, который привык к информации о доступе о людях, организациях, и сетевых ресурсах.
С этим установленным поставщиком услуг JNDI включает в категорию функциональность класса java.rmi.Naming.
Этот документ описывает функции поставщика услуг реестра RMI.
Следующие свойства среды JNDI используются поставщиком услуг реестра RMI. См. документацию JNDI для описания того, как свойства инициализируются, используя свойства среды, системные свойства, параметры апплета, и файлы ресурсов.
java.naming.factory.initial
Это свойство используется, чтобы выбрать поставщика услуг реестра как начальный контекст. Это не используется провайдером непосредственно. Это определяет имя класса начальной фабрики контекста для провайдера. Например:
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
Это свойство используется в соединении со свойством java.naming.provider.url. Это свойство должно быть установлено, если Вы используете реестр в качестве начального контекста. Единственное исключение - то, если Вы предоставляете только URL к начальному контексту, когда, Вы не должны определить это свойство. См. RMI URL для деталей.
java.naming.provider.url
Это свойство определяет расположение реестра, когда реестр используется в качестве начального контекста. Это - значение, RMI URL без компонента имени объекта (см. RMI Формат URL ниже). Например:
env.put(Context.PROVIDER_URL, "rmi://server:1099");
Значение по умолчанию этого свойства "rmi:", показывая реестр, работающий на порту 1099 из локального узла.
Это свойство используется в соединении со свойством java.naming.factory.initial.
java.naming.factory.state
Разделенный от двоеточия список полностью определенных имен классов классов фабрики состояния, используемых, чтобы получить состояние объекта для того, чтобы оно сохранило данный объект непосредственно. Можно использовать этот механизм, чтобы преобразовать объект в формы, которые могут быть сохранены в реестр. Поставщик услуг реестра RMI поддерживает хранение java.rmi.Remote, javax.naming.Reference, и объекты javax.naming.Referenceable. См. javax.naming.spi.NamingManager.getStateToBind() для деталей.
java.naming.factory.object
Разделенный от двоеточия список полностью определенных имен классов объектных классов фабрики для того, чтобы преобразовать объекты читал из реестра. Можно использовать этот механизм, чтобы преобразовать объект в формы, ожидаемые приложением. См. javax.naming.spi.NamingManager.getObjectInstance() для деталей.
com.sun.jndi.rmi.factory.socket
Это свойство определяет фабрику сокета для использования ко времени выполнения RMI, чтобы получить клиентские сокеты, чтобы выполнить вызовы RMI. Значение, определенное для фабрики сокета, должно иметь тип java.rmi.server.RMIClientSocketFactory. Если это свойство не устанавливается, фабрика сокета по умолчанию используется реестром.
java.naming.rmi.security.manager
Это свойство, когда установлено в любое значение, указывает, что провайдер должен попытаться установить RMISecurityManager. См. раздел Соображений Безопасности ниже.
Реестр RMI поддерживает плоское пространство имен. С тех пор нет никакой иерархии, каждое имя является атомарным. Каждое имя может быть составлено из любых символов, и случай является существенным.
Имена передают как параметры методам контекста реестра, и возвращаются как результаты тех методов, или поскольку Name возражает или как строки. Когда объект Name используется, у него должен быть единственный компонент, значение которого является атомарным именем, которое будет передано реестру. Когда строка используется в качестве имени, она интерпретируется как строковое представление составного имени. Так, если ctx является контекстом реестра, например, то следующие два развязывают операции, эквивалентны:
String name = ... ctx.unbind(name); ctx.unbind(new CompositeName(name));
Забота должна быть проявлена об именах, содержащих любой из четырех метасимволов, которые обрабатываются особенно во время парсинга составных имен: '/', '\\', '"', и '\''. Этих символов нужно должным образом оставить или заключены в кавычки. Атомарный X/Y имени, например, может быть представлен как составное имя X\/Y, чтобы не быть принятым за два имени компонента с X и Y как его компоненты. См. CompositeName для получения дополнительной информации.
JNDI оказывает поддержку для того, чтобы разрешить URL то имя объекты. Поставщик услуг реестра позволяет RMI URL, которые будут использоваться в качестве имен этим способом. Это обеспечивает обобщение функциональности java.rmi.Naming, только используя более общий интерфейс JNDI.
Класс com.sun.jndi.url.rmi.rmiURLContextFactory реализует фабрику контекста URL для RMI URL. Это позволяет RMI URL, который передадут как имя к контексту начальной буквы JNDI по умолчанию.
Формат RMI URL является одним из следующего:
rmi://[host][:port][/[object]] rmi:[/][object]Если имя объекта отсутствует, то URL называет реестр в данном узле и порту. Иначе, это называет удаленный объект зарегистрированным в том реестре под именем обеспеченный.
Если узел опускается, локальный узел принимается. Если порт опускается, порт реестра по умолчанию 1099 принимается.
Поставщик услуг реестра реализует интерфейсы java.naming.Referenceable и java.naming.Context. методы Context И Referenceable отображаются на операции реестра как описано ниже.
lookup() lookupLink()
Метод java.rmi.Registry.lookup() вызывают. Если возвращенный объект является оберткой вокруг javax.naming.Reference, объект, на который ссылаются, создается, используя javax.naming.spi.NamingManager.getObjectInstance(). Ссылки JNDI в настоящий момент не поддерживаются.
bind()
Метод java.rmi.Registry.bind() вызывают. С государственными фабриками сначала консультируются через javax.naming.spi.NamingManager.getStateToBind(). Связываемый объект должен иметь тип java.rmi.Remote, javax.naming.Reference, или javax.naming.Referenceable. Если объектом является javax.naming.Reference или javax.naming.Referenceable, его ссылка обертывается в обертку Remote и затем связывается (см. Обязательные Объекты в Реестр ниже).
rebind()
Метод java.rmi.Registry.rebind() вызывают. Объекты иначе обрабатываются что касается работы bind() JNDI.
unbind()
Метод java.rmi.Registry.unbind() вызывают.
rename()
Этот метод реализуется как последовательность операций JNDI: lookup(), bind(), unbind(). Последовательность не выполняется атомарно.
list()
Метод java.rmi.Registry.list() вызывают. Поскольку это не предоставляет информации о типах связанных объектов, у каждого возвращенного javax.naming.NameClassPair есть универсальный java.lang.Object как его имя класса.
listBindings()
Метод java.rmi.Registry.list() вызывают. Поскольку каждый javax.naming.Binding читается из получающегося перечисления, java.rmi.Registry.lookup() вызывают и проходится javax.naming.spi.NamingManager.getObjectInstance().
createSubcontext() destroySubcontext()
Эти операции не поддерживаются.
getNameParser()
Возвращает синтаксический анализатор имени для чувствительных к регистру атомарных имен.
getNameInNamespace()
Возвращает пустую строку (имя реестра).
composeName()
Возвращает состав двух имен.
addToEnvironment()
Указанное свойство добавляется к среде контекста. Если свойство java.naming.rmi.security.manager будет добавлено, то провайдер попытается установить менеджера безопасности RMI по умолчанию (см. Соображения Безопасности). Другие свойства могут быть добавлены или изменены в среде, но не иметь никакого дополнительного эффекта на контекст.
removeFromEnvironment()
Указанное свойство удаляется из среды контекста. Контекст иначе незатронут.
close()
Очищает внутреннее состояние, используемое провайдером, но иначе не имеет никакого непосредственного эффекта.
getReference()
Если этот контекст был создан из ссылки, клон той ссылки возвращается. Иначе новая ссылка для контекста возвращается, если это имя хоста может быть определено и не является "localhost" (см. Контексты Реестра Ограничения и Удаленные объекты ниже).
Привязка Объектов в Реестр
Объект может быть связан в контекст реестра, если он реализует интерфейс java.rmi.Remote. Объект может также быть связан, если это - Ссылочный объект JNDI, или если это реализует интерфейс Referenceable (когда соответствующая ссылка будет связана вместо объекта непосредственно).
Ограничение Контекстов Реестра и Удаленных объектов
Каждый контекст реестра RMI реализует интерфейс Referenceable. Это может поэтому быть связано в любое пространство имен JNDI-accessible, которое может хранить объекты Referenceable. Ссылка на отдельный удаленный объект, который регистрируется в реестре, может также быть создана, признавая тот объект быть связанной в другое пространство имен.
com.sun.jndi.rmi.registry.RegistryContextFactory класса реализует объектную фабрику, которая преобразовывает ссылки реестра в соответствующие контексты реестра или удаленные объекты.
Для контекста реестра, который будет создан, должен быть определен URL реестра. Этот URL может прибыть из свойства java.naming.provider.url, или может быть передан как имя к начальному контексту, или может быть встроен в ссылку реестра. Если URL не содержит имени хоста или использует имя хоста "localhost", то метод getReference() контекста реестра неспособен возвратить ссылку для контекста. Такой контекст реестра, поэтому, не может быть ограничен в другое пространство имен.
Ссылочный Формат реестра
Ссылка JNDI для реестра RMI содержит список строковых адресов (класс StringRefAddr), каждый тегированный с типом "URL". Каждый адрес содержит RMI URL, определяющий местоположение или реестра, или удаленного объекта, зарегистрированного в реестре (см. RMI Формат URL выше).
Когда многократные URL появляются в пределах единственной ссылки, каждый представляет альтернативный адрес для того же самого логического ресурса. Порядок адресов не является существенным. Игнорируются адреса не класса, StringRefAddr, или не адреса вводят "URL".
Пример 1
Чтобы создать начальный контекст, который получает доступ к реестру, устанавливает свойства java.naming.factory.initial и java.naming.provider.url как описано в Свойствах Среды выше. Затем имена, сохраненные в реестре, например, могут быть перечислены следующим образом:
Context ictx = new InitialContext(env); NamingEnumeration enum = ictx.list("");
Пример 2
Вместо того, чтобы использовать свойства как выше, можно передать RMI URL как имя, чтобы решить в начальном контексте по умолчанию:
Context registryCtx = (Context)ictx.lookup("rmi://host");
Пример 3
Контекст реестра может быть ограничен в другое пространство имен JNDI-accessible. Связывать registryCtx (от предыдущего примера) в каталог LDAP, например:
Context ldapCtx = (Context)ictx.lookup("ldap://server/o=sun,c=us"); ldapCtx.bind("cn=rmi", registryCtx);Если имена R1 и R2 будут связаны в этом реестре, то клиент JNDI, просматривающий пространство имен LDAP, будет видеть R1 и R2 ниже cn=rmi записи.
Пример 4
Удаленный объект, который регистрируется в реестре RMI, может быть связан в другое пространство имен JNDI-accessible, создавая ссылку для того объекта. Если переменный obj содержит объект по имени R1 от предыдущих примеров, это может быть связано в каталог LDAP следующим образом:
RefAddr addr = new StringRefAddr("URL", "rmi://host/R1"); Reference ref = new Reference(obj.getClass().getName(), addr); ldapCtx.bind("cn=R1", ref);
Обычные соображения безопасности RMI применяются. Для RMI, чтобы динамически загрузить классы из удаленного сервера, должен сначала быть установлен менеджер безопасности. Это может быть сделано таким же образом, как это было бы для любого другого приложения RMI. См. JavaTM Удаленная Спецификация Вызова метода. Или, если свойство java.naming.rmi.security.manager среды передадут к провайдеру, то провайдер попытается установить RMISecurityManager непосредственно.
Ходатайство, используя JNDI и провайдера реестра RMI должно быть удовлетворено следующие полномочия:
permission java.net.SocketPermission "host[:port]", "connect";
Для каждого узла/порта, идентифицированного в свойстве java.naming.provider.url и на названия строк URL, предоставленные методам контекста.
permission java.net.SocketPermission "host[:port]", "connect,accept";
Поскольку каждый узел/порт, идентифицированный в URL, представляет в виде строки в javax.naming.Reference s.
permission java.lang.RuntimePermission "setSecurityManager";
Используя свойство среды java.naming.rmi.security.manager, которое просит, чтобы провайдер реестра RMI установил RMISecurityManager.