如何以编程方式调用DiagnosticCommandMBean?

时间:2016-02-18 14:00:49

标签: java jmx mbeans

我想以编程方式运行DiagnosticCommandMBean。

作为一个例子,我正在尝试使用vmFlags(),它不带任何参数。这是我的测试代码:

4 * 3 * 2 * 1 * fact 0 = 4 * 3 * 2 * 1 * 1 = 24

这给了我这个例外:

ObjectName name = new ObjectName("com.sun.management:type=DiagnosticCommand");
String port = System.getProperty("com.sun.management.jmxremote.port");
JMXServiceURL url =
        new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:"+port+"/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
MBeanInfo info = ManagementFactory.getPlatformMBeanServer().getMBeanInfo(name);

mbsc.invoke(
        name,
        info.getOperations()[13].getName(), // vmFlags
        null,
        null
    );

我做错了什么?

1 个答案:

答案 0 :(得分:2)

在下面找到一个片段,它显示了一种更简单的方法(而不是通过RMI连接到正在运行的JVM)和mbeanServer.invoke(...)方法的正确语法。

ObjectName objectName =new ObjectName("com.sun.management:type=DiagnosticCommand");
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();

String operationName = "vmFlags";
Object[] params = new Object[1];
String[] signature = new String[]{String[].class.getName()};

String result = (String) mbeanServer.invoke(objectName, operationName, 
                params, signature);

System.out.printf("%s: %s%n", operationName, result);

输出(实际值替换为...

vmFlags: -XX:...