Как jconsole обнаруживает процессы с поддержкой JMX в локальной системе?

Когда я бегу jconsole он показывает мне список процессов Java:

Я мог бы тогда подключиться к одному из них и увидеть его MBeans, Как он обнаруживает процессы JMX? Как я могу сделать это в программе?

3 ответа

В этой статье показано, как это сделать с помощью Attach API из JDK tools.jar.

Отвечая, так как у меня тоже был этот вопрос и я получил ответ. В JDK есть программа JPS, которая показывает процессы Java. Я не уверен на 100% (не хочу углубляться в код jconsole), но на 99% уверен, что jconsole использует тот же механизм, что и jps:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/tools/jps/Jps.java?av=f

HostIdentifier hostId = arguments.hostId();
MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(hostId);
// get the set active JVMs on the specified host.
Set<Integer> jvms = monitoredHost.activeVms();

Эти классы являются частью tools.jar, вам нужно включить их в путь к классам проекта.

Если мы пойдем глубже (я не раскрываю все промежуточные шаги) - наконец, мы будем знать, что список активных виртуальных машин заполняется из файлов hsperfdata во временных каталогах:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java

Вот ссылка, чтобы узнать больше: java hsperfdata каталог

Наконец, вот фрагмент кода, позволяющий получить идентификаторы java-процессов:

sun.jvmstat.monitor.MonitoredHost host = sun.jvmstat.monitor.MonitoredHost.getMonitoredHost(new sun.jvmstat.monitor.HostIdentifier((String) null));
System.out.println(host.activeVms());

PS

Затем вы можете использовать Attach API (как уже упоминалось), чтобы обнаружить остальные необходимые вещи.

После того, как вы зарегистрируете MBean в вашем приложении, вот так:

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
//register the MBean
ObjectMbean mBean = new ObjectMbean();
ObjectName name = new ObjectName("com.gd.eventfiltering.jmx:type=SystemConfig");
mbs.registerMBean(mBean, name);

Затем вы можете назвать свой MBean следующим образом:

JMXServiceURL url = new JMXServiceURL(JMX_PATH);
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName(JMX_OBJECT);

IObjectMbean  mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName,IObjectMbean.class, false);

//call the method
List<EventType> filters = mbeanProxy.methodFromYourMBean();


jmxc.close();
Другие вопросы по тегам