Пакет javax.management.remote.rmi
Подключение RMI — это подключение для удаленного API JMX, которое использует RMI для передачи запросов клиента удалённому серверу MBean.
См.: Описание
| Интерфейс | Описание |
|---|---|
| RMIConnection | Объект RMI, используемый для перенаправления запроса MBeanServer от клиента к его реализации MBeanServer на стороне сервера. |
| RMIServer | Объект RMI, используемый для установления подключений к подключению RMI. |
| Класс | Описание |
|---|---|
| RMIConnectionImpl | Реализация интерфейса |
| RMIConnectionImpl_Stub | |
| RMIConnector | Подключение к удалённому подключению RMI. |
| RMIConnectorServer | Сервер подключения API JMX, который создаёт подключения на основе RMI от удалённых клиентов. |
| RMIIIOPServerImpl | Объект |
| RMIJRMPServerImpl | Объект |
| RMIServerImpl | Объект RMI, представляющий сервер подключения. |
| RMIServerImpl_Stub |
Описание пакета javax.management.remote.rmi
Подключатель RMI — это подключатель к удаленному API JMX, использующий RMI для передачи запросов клиента на удаленный сервер MBean. Этот пакет определяет классы, которые пользователю подключателя RMI необходимо ссылаться напрямую, как для клиентской, так и для серверной стороны. Он также определяет определённые классы, к которым пользователь обычно не обращается напрямую, но которые должны быть определены для взаимодействия различных реализаций подключателя RMI.
Подключатель RMI поддерживает транспорт JRMP для RMI, а также (по желанию) транспорт IIOP.
Как и большинство подключателей в удалённом API JMX, подключатель RMI обычно имеет адрес, который является JMXServiceURL. Часть протокола этого адреса составляет rmi для подключателя, использующего стандартный транспорт RMI (JRMP), или iiop для подключателя, использующего RMI/IIOP.
Существуют две формы адресов подключателя RMI:
- В форме JNDI URL указывает местоположение заглушки RMI для подключателя. Эта заглушка RMI — это Java-объект типа
RMIServer, предоставляющий удалённый доступ к серверу подключателя. В этой форме адреса заглушка RMI извлекается из внешнего элемента каталога, включенного в URL. Внешним каталогом является любой каталог, распознаваемыйJNDI, обычно реестр RMI, LDAP или COS Naming. - В кодированной форме URL напрямую включает информацию, необходимую для подключения к серверу подключателя. При использовании RMI/JRMP кодированная форма представляет собой сериализованную заглушку RMI для серверного объекта, закодированную с использованием BASE64 без встроенных символов новой строки. При использовании RMI/IIOP кодированная форма представляет собой CORBA IOR для серверного объекта.
Адреса рассматриваются более подробно ниже.
Создание сервера подключателя RMI
Обычно сервер подключателя RMI создаётся путём предоставления адреса подключателя RMI методу JMXConnectorServerFactory.newJMXConnectorServer. Сервер MBean, к которому подключён сервер подключателя, может быть указан в качестве параметра этого метода. В качестве альтернативы сервер подключателя может быть зарегистрирован как MBean на этом сервере MBean.
Сервер подключателя RMI также может быть создан путём построения экземпляра RMIConnectorServer, явно или через метод createMBean сервера MBean.
Выбор транспорта RMI
Вы можете выбрать транспорт RMI (JRMP или IIOP), указав rmi или iiop в части protocol URL при создании сервера подключателя. Также можно создать специализированные серверы подключателей, создав экземпляр соответствующего подкласса RMIServerImpl и передав его в конструктор RMIConnectorServer.
Адреса подключателей, сгенерированные сервером
Если указанный вами serviceURL имеет пустой путь URL (после необязательного хоста и порта) или если вы не указали serviceURL, то сервер подключателя сгенерирует новый JMXServiceURL, который клиенты могут использовать для подключения:
-
Если
serviceURLвыглядит так:service:jmx:rmi://host:port
то сервер подключателя сгенерирует
RMIJRMPServerImpl, и возвращённыйJMXServiceURLбудет выглядеть так:service:jmx:rmi://host:port/stub/XXXX
где
XXXX— сериализованная форма заглушки для сгенерированного объекта, закодированная в BASE64 без новых строк. -
Если
serviceURLвыглядит так:service:jmx:iiop://host:port
то сервер подключателя сгенерирует
RMIIIOPServerImpl, и возвращённыйJMXServiceURLбудет выглядеть так:service:jmx:iiop://host:port/ior/IOR:XXXX
где
IOR:XXXX— стандартное CORBA-кодирование Interoperable Object Reference для сгенерированного объекта. -
Если нет
serviceURL, должен быть предоставлен пользователемRMIServerImpl. Если методtoStubэтого объекта возвращает экземплярStub, то сервер подключателя сгенерируетJMXServiceURLв формеiiopвыше. В противном случае он сгенерируетJMXServiceURLв формеrmi.
host в предоставленном пользователем serviceURL является необязательным. Если присутствует, он копируется в сгенерированный JMXServiceURL, но в противном случае игнорируется. Если отсутствует, сгенерированный JXMServiceURL будет содержать имя локального хоста.
port в предоставленном пользователем serviceURL также является необязательным. Если присутствует, он также копируется в сгенерированный JMXServiceURL; в противном случае сгенерированный JMXServiceURL не будет содержать порт. Для serviceURL с протоколом rmi port, если присутствует, указывает порт, на котором следует экспортировать сгенерированный удалённый объект. Он не имеет других эффектов.
Если пользователь предоставляет RMIServerImpl вместо JMXServiceURL, сгенерированный JMXServiceURL будет содержать имя локального хоста в части host и не будет содержать port.
Адреса подключателей на основе записей каталога
В качестве альтернативы описанным выше сгенерированным адресам, адрес serviceURL при создании сервера подключателя может указывать на адрес каталога, в котором следует хранить предоставленную или сгенерированную RMIServer заглушку. Этот адрес каталога используется как клиентом, так и сервером.
В этом случае serviceURL имеет одну из этих двух форм:
service:jmx:rmi://host:port/jndi/jndi-name
service:jmx:iiop://host:port/jndi/jndi-name Здесь, jndi-name — строка, которую можно передать методу javax.naming.InitialContext.bind.
Как обычно, host и :port можно опустить.
Сервер подключателя сгенерирует RMIServerImpl на основе протокола (rmi или iiop) и, для rmi, port (если он есть). При запуске сервер подключателя получит заглушку из этого объекта, используя метод toStub, и сохранит объект с помощью заданного jndi-name. Как обычно, используются свойства, определённые API JNDI.
Например, если JMXServiceURL:
service:jmx:rmi://ignoredhost/jndi/rmi://myhost/mynameто сервер подключателя сгенерирует
RMIJRMPServerImpl и сохранит его заглушку используя имя JNDI rmi://myhost/myname, что соответствует записи
myname в реестре RMI, работающем на стандартном порту хоста myhost. Обратите внимание, что реестр RMI позволяет регистрацию только с локального хоста. Таким образом, в этом случае myhost должно быть именем (или именем) хоста, на котором работает сервер подключателя. В этом JMXServiceURL, первый rmi: указывает на подключатель RMI, а второй rmi: указывает на реестр RMI.
В качестве другого примера, если JMXServiceURL:
service:jmx:iiop://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=thatто сервер подключателя сгенерирует
RMIIIOPServerImpl и сохранит его заглушку используя имя JNDI ldap://dirhost:9999/cn=this,ou=that, что соответствует записи
cn=this,ou=that в каталоге LDAP, работающем на порту 9999 хоста dirhost. Если JMXServiceURL:
service:jmx:iiop://ignoredhost/jndi/cn=this,ou=thatто сервер подключателя сгенерирует
RMIIIOPServerImpl и сохранит его заглушку используя имя JNDI cn=this,ou=that. Для работы в этом случае API JNDI должен быть должным образом настроен для предоставления информации о том, какой каталог использовать.
В этих примерах имя хоста ignoredhost не используется сервером подключателя или его клиентами. Его можно опустить, например:
service:jmx:iiop:///jndi/cn=this,ou=that
Однако, рекомендуется использовать имя хоста, на котором работает сервер подключателя. Это часто отличается от имени хоста каталога.
Атрибуты сервера подключателя
При использовании стандартного транспорта JRMP, RMI сокет-фабрики могут быть указаны с помощью атрибутов jmx.remote.rmi.client.socket.factory и jmx.remote.rmi.server.socket.factory в environment, передаваемом конструктору RMIConnectorServer. Значения этих атрибутов должны быть типов RMIClientSocketFactory и RMIServerSocketFactory соответственно. Эти фабрики используются при создании RMI-объектов, связанных с подключением.
Создание клиента подключателя RMI
Клиент подключателя RMI обычно создаётся с помощью JMXConnectorFactory, с JMXServiceURL, у которого протокол rmi или iiop.
Если JMXServiceURL был сгенерирован сервером, как описано выше в разделе "адреса подключателей, сгенерированные сервером", то клиенту потребуется получить его напрямую или косвенно от сервера. Обычно сервер делает JMXServiceURL доступным, храня его в файле или службе поиска.
Если JMXServiceURL использует синтаксис каталога, как описано выше в разделе "адреса подключателей на основе записей каталога", то клиент может получить его, как только что описано, или клиент и сервер оба могут знать соответствующую запись каталога для использования. Например, если сервер подключателя для агента Whatsit использует запись whatsit-agent-connector в реестре RMI на хосте myhost, то клиент и сервер оба могут знать, что соответствующий JMXServiceURL:
service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector
Если у вас есть RMI-заглушка типа RMIServer, вы можете напрямую построить RMI-соединение, используя соответствующий конструктор RMIConnector.
Указание ORB для подключателя RMI/IIOP
При использовании транспорта IIOP клиент и сервер могут указать используемый ORB с помощью атрибута java.naming.corba.orb. Подключение к ORB происходит во время start для сервера подключателя и во время connect для клиента подключателя. Если атрибут java.naming.corba.orb содержится в отображении окружения, то его значение (объект ORB) используется для подключения IIOP-заглушек. В противном случае новый org.omg.CORBA.ORB создаётся путём вызова org.omg.CORBA.ORB.init((String[])null,(Properties)null). Позже клиент или сервер подключателя RMI в той же JVM могут повторно использовать этот ORB или создать другой аналогичным образом.
Если атрибут java.naming.corba.orb указан и не ссылается на ORB, то будет выброшено исключение .IllegalArgumentException
Описание механизма не применяется, когда удаленные объекты IIOP (заглушки или серверы) создаются и подключаются к ORB вручную до передачи в RMIConnector и RMIConnectorServer.
Динамическая загрузка кода
Если клиент или сервер RMI-соединения получает от своего партнера экземпляр класса, который ему неизвестен, и динамическая загрузка кода активна для RMI-соединения, то класс может быть загружен из кодовой базы, указанной партнером. Статья Динамическая загрузка кода с помощью Java RMI описывает это более подробно.
- С момента:
- 1.5
- См. также:
- JavaTM Удаленный вызов методов (RMI), Java Naming and Directory InterfaceTM (JNDI), RFC 2045, раздел 6.8, "Базовая кодировка Base64"
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.