搜索
您的当前位置:首页正文

【麦子学院分享】用JMX连接本地JVM上运行的Java程序

来源:知库网
IT在线教育平台———麦子学院:http://www.maiziedu.com

【麦子学院分享】用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 beanSet = mbeanConn.queryNames(null, null);

...

} finally {

jmxConnector.close();

IT在线教育平台———麦子学院:http://www.maiziedu.com

}

当然也可以不使用VM参数,代码本身可以通过编程在指定端口号发布,但这肯定就比现在的需求更复杂了。

如果要根据PID来连接,则需要使用Java 6以上的版本:

List vms = VirtualMachine.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 beanSet = mbeanConn.queryNames(null, null);

...

} 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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top