Как подключиться к JMX для JVM на локальной машине по pid (Java 9+) - PullRequest
2 голосов
/ 11 января 2020

Я хочу запросить MBean на JVM, работающей на локальной машине.

String address = "???";
JMXConnectorFactory.connect(new JMXServiceURL(address))
  .getMBeanServerConnection()
  .getAttribute(new ObjectName("<object name>"), "<attribute name>");

Я не настроил com.sun.management.jmxremote.port = XXX, но, поскольку jconsole GUI все еще может подключаться к JVM и наблюдать / взаимодействовать с MBeans там ( Я проверил это), я предполагаю, что возможно создать адресную строку, которая ссылается на процесс JVM, выполняющийся на определенном pid (поскольку jmxremote.port = XXX не будет существовать).

Однако я не могу найти документация о том, как создать адрес для локального процесса JVM с указанным pid.

Есть некоторые ответы от 5+ лет go, которые используют класс sun.management.ConnectorAddressLink, но этот класс был удален в Java 9+. Я также пытался просмотреть исходный код нескольких проектов, таких как jmxlocal , но все эти проекты устарели, и также используют тот же самый класс ConnectorAddressLink , который сейчас нет.

1 Ответ

0 голосов
/ 12 января 2020

(Я предполагаю, что вы не спрашиваете о формате строки, просто о том, как найти порт.)

Вы можете договориться о каком-то контракте на порт (ы) jmx. Если бы у вас было 2+ jvms на локальном хосте, у них, очевидно, были бы разные порты, поэтому клиент jmx не может ни угадать, ни сканировать порты (плохой этикет). Может быть, диапазон портов, к которому нужно вслепую пытаться подключиться.

Вы можете положиться на что-то другое, например на широковещательный пакет или соглашение о многоадресном канале, чтобы запросить ваши программы, чтобы они обнаружили, что они существуют на каком-то порту jmx, но вы бы Я должен запрограммировать себя и ожидать, что jvms запустит такой модуль.

В противном случае на linux, просмотрев / proc / ... вы можете обнаружить процессы (фильтрующие только java) и какой у них порт. открыт, или некоторые исполняемые exe c backflips с netstat (linux или windows), вы можете иметь список прослушивающих сокетов. Но опять же, это не означает, что эти сокеты являются службой JMX - вам все еще нужно соглашение, если вы не хотите проверять и обрабатывать процессы произвольных портов.

Однако, если вы можете перечислить процессы, вы, вероятно, сможете получить их командные строки и найдите java и их собственные системные свойства jmx, раскрывающие используемый ими порт ...

Несколько вещей, которые можно попробовать. Надеюсь, это поможет.

...