Как jconsole обнаруживает процессы с поддержкой JMX в локальной системе?
Когда я бегу jconsole
он показывает мне список процессов Java:
Я мог бы тогда подключиться к одному из них и увидеть его MBeans
, Как он обнаруживает процессы JMX? Как я могу сделать это в программе?
3 ответа
В этой статье показано, как это сделать с помощью Attach API из JDK tools.jar.
Отвечая, так как у меня тоже был этот вопрос и я получил ответ. В JDK есть программа JPS, которая показывает процессы Java. Я не уверен на 100% (не хочу углубляться в код jconsole), но на 99% уверен, что jconsole использует тот же механизм, что и jps:
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 во временных каталогах:
Вот ссылка, чтобы узнать больше: 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();