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