Ответ 1
Я повторно использую ответ, который я написал ранее для этого вопроса: Не удается подключиться к MBeanServer от Tomcat через jconsole в Java6
Он не завершен, но может помочь:
Предположим, что у вас есть JMX-сервер (псевдоним "JMX Agent" псевдоним "JVM, который вы хотите подключиться к" ), запущенный на "TARGET MACHINE" с портом реестра RMI в "RMI REGISTRY PORT" и портом сервера JMX RMI на "JMX RMI SERVER PORT".
Примечание:
- Реестр RMI сообщает клиентам JMX, где можно найти порт сервера JMX RMI; информацию можно получить под клавишей
jmxrmi
. - Порт реестра RMI обычно известен как установленный через свойства системы при запуске JVM.
- Порт сервера JMX RMI обычно не, известный как JVM выбирает его наугад (если не приняты другие меры предосторожности).
Следующий URI приведет к успешному соединению (проверено)
service:jmx:rmi://<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
Это выглядит противно. Разрежьте его.
Этот URI является URL-адресом RFC2609 "URL-адрес протокола службы" (ну, это действительно URI, не так ли?)
Он состоит из:
-
service
- константа -
jmx:rmi
- тип службы, состоящий из: абстрактного типаjmx
и схемы URLrmi
- остальное - sap (спецификация протокола доступа к услугам)
sap разлагается на:
-
//<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>
- ipsite -
/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
- часть URL
Хорошо информированный клиент JMX подключается к "ipsite" для обмена JMX-over-RMI; но что из JMX-клиента, который не знает этот порт? Patience...
URL-часть разбита на:
-
/jndi/
- Кажется, это говорит клиенту JMX, что он может получить информацию о поиске в месте, которое следует за -
rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
- Да, мы получаем информацию о сервере JMX RMI в реестре RMI под ключом поискаjmxrmi
Это несколько повозка перед лошадью, так как нужно сначала связаться с реестром RMI, указанным частью последней URL-адреса SLP.
После царапания головы, интуитивно, попробуйте:
service:jmx:rmi://<TARGET_MACHINE>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
Да, это работает! Порт сервера JMX RMI хорошо получен из реестра. Во-вторых, целевая машина также должна быть получена из реестра, таким образом:
service:jmx:rmi:///jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
Даже лучше, это тоже работает!
Литература:
- http://download.oracle.com/javase/6/docs/api/javax/management/remote/rmi/package-summary.html
- http://download.oracle.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html
- http://mx4j.sourceforge.net/docs/ch03s04.html
- http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevg
- http://www.rfc-editor.org/rfc/rfc2609.txt