【发布时间】:2015-06-03 09:05:32
【问题描述】:
任何人都可以给我一些指南,告诉我在我创建了一个 JMX 连接之后如何获取它的属性吗?我需要以编程方式获取这些信息。 我没有得到任何提示就搜索了这个。 任何想法将不胜感激。
【问题讨论】:
标签: java jvm environment-variables jmx
任何人都可以给我一些指南,告诉我在我创建了一个 JMX 连接之后如何获取它的属性吗?我需要以编程方式获取这些信息。 我没有得到任何提示就搜索了这个。 任何想法将不胜感激。
【问题讨论】:
标签: java jvm environment-variables jmx
我认为最小的例子应该是这样的:
public class JMXSystemProperties {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
TabularDataSupport data = (TabularDataSupport) mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "SystemProperties");
for (Entry<Object, Object> entry : data.entrySet()) {
CompositeDataSupport value = (CompositeDataSupport) entry.getValue();
System.out.println(entry.getKey() + " = " + value.values());
}
}
}
您仍然可以使用jvisualvm 查看所有数据是否正确。
您可以将 url 中的 localhost 和端口 9004 替换为更适合您的服务器和端口。
谢谢
【讨论】:
你想要的属性可以从RuntimeMXBean获取。
【讨论】:
JMX.newMXBeanProxy 不应该在这里使用。相反应该使用ManagementFactory.getPlatformMXBean。建议您删除您的评论,以免误导他人。
作为提示:连接到 JMX 后,在我看来,有一个标准的 MXBean 接口,它实现了 java.lang.management.RuntimeMXBean。相关ObjectName应该是:
ObjectName objName = new ObjectName("java.lang:type=Runtime");
获取代理实例对象是这样的:
RuntimeMXBean runtimeMXBean = JMX.newMXBeanProxy(mbeanServer, objName, RuntimeMXBean.class, true);
也许这对其他人有帮助。
注意如果有人可以提供指向支持 JMX 的系统需要 RuntimeMXBean 接口的文档的链接,那将是受欢迎的。
【讨论】:
runtimeMXBean.getSystemProperties 时,它会返回实际上不是Map<String,String> 的内容(它是由编译器输入的,但在运行时是其他内容)。我认为使用JMX.newMXBeanProxy 是罪魁祸首。相反,我们应该使用ManagementFactory.getPlatformMXBean 来获取正确解包数据的代理。
已经提供的答案都没有真正对我有用。我遇到的一些问题:
JMX.newMXBeanProxy 看起来很有希望避免所有这些拆包。但是尽管它编译...在运行时,我发现代理的getSystemProperties 的结果实际上根本没有正确解包。它仍然是一个TabularDataSupport 对象(是的,即使它的编译时类型说它应该是一个Map<String,String>,实际上它不是)。 所以实际上确实对我有用,解决了所有这些陷阱,因此它可以像您可能想要的那样将系统属性作为Map<String,String>。
package example;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Map;
import java.util.Map.Entry;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class GetJmxSystemProps {
public static void main(String[] args) throws Exception {
JMXServiceURL serviceUrl = new JMXServiceURL("service:jmx:rmi://localhost:9111/jndi/rmi://localhost:9111/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
RuntimeMXBean proxy = ManagementFactory.getPlatformMXBean(connection, RuntimeMXBean.class);
Map<String, String> sysprops = proxy.getSystemProperties();
for (Entry<String, String> e : sysprops.entrySet()) {
System.out.println(e.getKey()+"="+e.getValue());
}
}
}
总结一下:这里的关键点是使用JMX.newMXBeanProxy 获取RuntimeMXBean 类型的bean 是有问题的,并且没有正确地将TabularDataSupport 对象解包到Map<String,String> 中。改用ManagementFactory.getPlatformMXBean 方法可以避免这个问题。
【讨论】: