当我运行jconsole
时,它会显示一个Java进程列表:
然后我可以连接到其中一个并查看其MBeans
。它是如何发现JMX流程的?我怎么能在程序中这样做?
答案 0 :(得分:1)
回答,因为我也有这个问题,并得到了答案。 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 directory
最后,这里有一个代码片段,允许您获取java进程ID:
sun.jvmstat.monitor.MonitoredHost host = sun.jvmstat.monitor.MonitoredHost.getMonitoredHost(new sun.jvmstat.monitor.HostIdentifier((String) null));
System.out.println(host.activeVms());
P.S。
然后你可以使用Attach API(如提到的kostya)来发现其他需要的东西。
答案 1 :(得分:0)
This article显示了如何使用JDK tools.jar中的Attach API进行操作。
答案 2 :(得分:-1)
在您的应用程序中注册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();