Пакет 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 объясняет это более подробно.
- Since:
- 1.5
- See Also:
| Класс | Описание |
|---|---|
| RMIConnection | RMI-объект, используемый для перенаправления запроса MBeanServer от клиента к его реализации MBeanServer на стороне сервера. |
| RMIConnectionImpl | Реализация интерфейса RMIConnection. |
| RMIConnectionImpl_Stub | Удаленный заглушка RMIConnectionImpl. |
| RMIConnector | Подключение к удаленному RMI-коннектору. |
| RMIConnectorServer | Сервер коннектора JMX API, создающий RMI-соединения от удаленных клиентов. |
| RMIJRMPServerImpl | Объект RMIServer, экспортируемый через JRMP и создающий подключения клиентов как RMI-объекты, экспортированные через JRMP. |
| RMIServer | RMI-объект, используемый для установления подключений к RMI-коннектору. |
| RMIServerImpl | RMI-объект, представляющий сервер коннектора. |
| RMIServerImpl_Stub | Удаленный заглушка RMIServerImpl. |
© 1993, 2023, 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/21/docs/api/java.management.rmi/javax/management/remote/rmi/package-summary.html