Пакет javax.management.remote.rmi

Подключатель RMI — это подключатель к API удалённого JMX, который использует RMI для передачи запросов клиента на удалённый сервер MBean. Этот пакет определяет классы, к которым пользователь подключателя RMI должен иметь прямой доступ, как для клиентской, так и для серверной сторон. Он также определяет определённые классы, к которым пользователь обычно не обращается напрямую, но которые должны быть определены для взаимодействия различных реализаций подключателя RMI.

Подключатель RMI поддерживает транспорт JRMP для RMI.

Как и большинство подключателей в API удалённого JMX, подключатель RMI обычно имеет адрес, который является JMXServiceURL. Часть протокола этого адреса — rmi для подключателя, использующего стандартный транспорт RMI (JRMP).

Существует две формы адресов подключателя RMI:

  • В форме JNDI URL указывает местоположение заглушки RMI для подключателя. Эта заглушка RMI — это объект Java типа RMIServer, который обеспечивает удалённый доступ к серверу подключателя. В этой форме адреса заглушка RMI извлекается из внешней записи каталога, включённой в URL. Внешний каталог — это любой каталог, распознаваемый JNDI, обычно реестр RMI, LDAP или COS Naming.
  • В кодированной форме URL напрямую содержит информацию, необходимую для подключения к серверу подключателя. При использовании RMI/JRMP кодированная форма представляет собой сериализованную заглушку RMI для объекта сервера, закодированную с помощью BASE64 без встроенных новых строк.

Адреса рассматриваются более подробно ниже.

Создание сервера подключателя RMI

Обычно сервер подключателя RMI создаётся путём предоставления адреса подключателя RMI методу JMXConnectorServerFactory.newJMXConnectorServer. Сервер MBean, к которому подключается сервер подключателя, может быть указан в качестве параметра этого метода. В качестве альтернативы сервер подключателя может быть зарегистрирован как MBean на этом сервере MBean.

Сервер подключателя RMI также можно создать, создав экземпляр RMIConnectorServer, явно или через метод createMBean сервера MBean.

Выбор транспорта RMI

Вы можете выбрать транспорт RMI, указав rmi в части protocol адреса serviceURL при создании сервера подключателя. Вы также можете создать специализированные серверы подключателей, создав экземпляр соответствующего подкласса RMIServerImpl и передав его конструктору RMIConnectorServer.

Адреса подключателей, сгенерированные сервером

Если указанный вами serviceURL имеет пустой путь URL (после необязательного хоста и порта) или если вы не указали serviceURL, то сервер подключателя создаст новый JMXServiceURL, который клиенты могут использовать для подключения:

  • Если serviceURL выглядит так:

    service:jmx:rmi://host:port

    то сервер подключателя сгенерирует RMIJRMPServerImpl, и возвращаемый JMXServiceURL будет выглядеть так:

    service:jmx:rmi://host:port/stub/XXXX

    где XXXX — сериализованная форма заглушки для сгенерированного объекта, закодированная в BASE64 без новых строк.

  • Если нет serviceURL, должен быть предоставлен RMIServerImpl. Сервер подключателя сгенерирует 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

Здесь jndi-name — строка, которую можно передать в javax.naming.InitialContext.bind.

Как обычно, host и :port могут быть опущены.

Сервер подключателя сгенерирует RMIServerImpl на основе протокола (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:rmi://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that
то сервер подключателя сгенерирует RMIJRMPServerImpl и сохранит его заглушку с помощью имени JNDI
ldap://dirhost:9999/cn=this,ou=that
, что означает запись cn=this,ou=that в каталоге LDAP, работающем на порте 9999 хоста dirhost.

Если JMXServiceURL:

service:jmx:rmi://ignoredhost/jndi/cn=this,ou=that
то сервер подключателя сгенерирует RMIJRMPServerImpl и сохранит его заглушку с помощью имени JNDI
cn=this,ou=that
. Для работы в этом случае API JNDI должно быть должным образом настроено для предоставления информации о том, какой каталог использовать.

В этих примерах имя хоста ignoredhost не используется сервером подключателя или его клиентами. Его можно опустить, например:

service:jmx:rmi:///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 является протоколом.

Если JMXServiceURL был сгенерирован сервером, как описано выше в разделе "адреса подключателей, сгенерированные сервером", то клиенту потребуется получить его напрямую или косвенно от сервера. Обычно сервер делает JMXServiceURL доступным, сохраняя его в файле или службе поиска.

Если JMXServiceURL использует синтаксис каталога, как описано выше в разделе "адреса подключателей, основанные на записях каталога", то клиент может получить его как только что описано, или клиент и сервер могут оба знать соответствующую запись каталога для использования. Например, если сервер подключателя агента Whatsit использует запись whatsit-agent-connector в реестре RMI на хосте myhost, то клиент и сервер могут оба знать, что соответствующий JMXServiceURL является:

service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector

Если у вас есть заглушка RMI типа RMIServer, вы можете создать соединение RMI напрямую, используя соответствующий конструктор RMIConnector.

Динамическая загрузка кода

Если клиент или сервер подключателя RMI получает от своего партнёра экземпляр класса, который ему неизвестен, и если динамическая загрузка кода активна для соединения RMI, то класс можно загрузить из кодовой базы, указанной партнёром. Руководство Java RMI описывает это подробнее.

С:
1.5
См. также:
RFC 2045, раздел 6.8, "Кодировка BASE64 в заголовке Content-Transfer-Encoding"
Интерфейс Описание
RMIConnection

Объект RMI, используемый для перенаправления запроса MBeanServer от клиента к его реализации MBeanServer на стороне сервера.

RMIServer

Объект RMI, используемый для установления соединений с подключателем RMI.

Класс Описание
RMIConnectionImpl

Реализация интерфейса RMIConnection.

RMIConnectionImpl_Stub
RMIConnector

Подключение к удалённому RMI-коннектору.

RMIConnectorServer

Сервер коннектора JMX API, который создаёт подключения на основе RMI от удалённых клиентов.

RMIIIOPServerImpl Устарело.
Этот транспорт больше не поддерживается.
RMIJRMPServerImpl

Объект RMIServer, экспортируемый через JRMP, который создаёт подключения клиентов как RMI-объекты, экспортированные через JRMP.

RMIServerImpl

RMI-объект, представляющий сервер коннектора.

RMIServerImpl_Stub

© 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.management.rmi/javax/management/remote/rmi/package-summary.html

Spec-Zone .ru
спецификации, руководства, описания, API