【麦子学院分享】用JMX连接本地JVM上运行的Java程序
如果有人问你,如何用JMX连接本地JVM上运行的Java程序,你会怎么回答?
其实,他只是想开发一个JMX的客户端来配置一个本地Java程序。这个时候,千万不要推荐JConsole,因为JConsole是一个通用的JMX客户端,对主程序的性能存在负面影响。
在JConsole中,可以选择PID来连接Java进程。但是在JMX的API中,却找不到任何方法是使用PID作为参数的。这时候怎么处理呢?
使用一些类似下面的程序来连接JMX服务器,就可实现。不过,需要在运行服务器时指定以下参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.ssl=false
为了绑定特定地址,还需要在增加下面的VM参数:
-Djava.rmi.server.hostname=A.B.C.D
IT在线教育平台———麦子学院:http://www.maiziedu.com
这样,你可以像下面的JMX客户端代码一样连接你的服务器了:
String host = \"localhost\"; // or some A.B.C.D
int port = 1234;
String url = \"service:jmx:rmi:///jndi/rmi://\" + host + \":\" + port + \"/jmxrmi\";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
try {
MBeanServerConnection
jmxConnector.getMBeanServerConnection();
mbeanConn =
// now query to get the beans or whatever
Set ... } finally { jmxConnector.close(); IT在线教育平台———麦子学院:http://www.maiziedu.com } 当然也可以不使用VM参数,代码本身可以通过编程在指定端口号发布,但这肯定就比现在的需求更复杂了。 如果要根据PID来连接,则需要使用Java 6以上的版本: List for (VirtualMachineDescriptor desc : vms) { VirtualMachine vm; try { vm = VirtualMachine.attach(desc); } catch (AttachNotSupportedException e) { continue; } Properties props = vm.getAgentProperties(); String connectorAddress = IT在线教育平台———麦子学院:http://www.maiziedu.com props.getProperty(\"com.sun.management.jmxremote.localConnectorAddress\"); if (connectorAddress == null) { continue; } JMXServiceURL url = new JMXServiceURL(connectorAddress); JMXConnector connector = JMXConnectorFactory.connect(url); try { MBeanServerConnection mbeanConn connector.getMBeanServerConnection(); Set ... } finally { jmxConnector.close(); = IT在线教育平台———麦子学院:http://www.maiziedu.com } } 我已发布过一个新的SimpleJMX包,该包能帮助很简单的启动一个JMX服务,并向远程客户端发送beans。 //创建一个新的服务器并监听8000端口 JmxServer jmxServer = new JmxServer(8000); //启动服务器 jmxServer.start(); //注册下面定义的lookupCache对象 jmxServer.register(lookupCache); jmxServer.register(someOtherObject); //停止服务 jmxServer.stop(); 该包确实有一个客户端的接口,但是当前没有人一种机制是可以通过PID来查找进程的, IT在线教育平台———麦子学院:http://www.maiziedu.com 只支持主机/端口的组合方式查找。 推荐学习:Java高级应用视频教程(http://www.maiziedu.com/course/15/) 文章来源:code 因篇幅问题不能全部显示,请点此查看更多更全内容