java jmx 远程,如何通过java代码设置JMX远程端口系统环境参数进行远程监控?

I have a program which requires dynamically (i.e. at run time) opening an available socket and start a JMX agent on it. This JMX parameters are being set inside the Java code and not through command line. This works fine. Thereafter it is needed to monitor( i.e issue JMX commands etc) through Java Visual VM

remotely

The RMI server agent in the program is on the lines of out of box management described at:

http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html

The question I have can be summarized as:

How can such command line properties be set to the system level

through the Java code, so that remote profiling can be used??

-Dcom.sun.management.jmxremote.port=1234

If the "jmxremote.port" and other parameters are set through command line,

remote monitoring works fine. I am trying to find a way to do this through Java

and not through the command line.

The program can not specify the port through the command line as the new available port has to be figured out at run time.

The process needs remote monitoring and it works fine locally.

If the following parameters are not specified at command line, Java Visual VM does not connect to the process.

-Dcom.sun.management.jmxremote.port=1234

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname=10.0.0.128

I have tried.

System.setProperty("com.sun.management.jmxremote.port",Integer.toString(port));

This is one of the first things done in the program before starting the JMXConnectorServer. Unfortunately it is not recognized. Only the run time properties (i.e. specified through command line are recognized for JMX connection by Java Visual VM).

Also came across the way properties can be extracted from java collection classes but could not reach how to trace the property "com.sun.management.jmxremote.port="

public static void setEnv(Map newenv) throws Exception {

Class[] classes = Collections.class.getDeclaredClasses();

Map env = System.getenv();

for(Class cl : classes) {

if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {

Field field = cl.getDeclaredField("m");

field.setAccessible(true);

Object obj = field.get(env);

Map map = (Map) obj;

//map.clear();

map.putAll(newenv);

}

}

}

Any help would be appreciated!

解决方案

kbec's answer showed the way but did not work for me - however by looking at this post I was able to modify it and get a working solution.

public static String loadJMXAgent(int port) throws IOException,

AttachNotSupportedException, AgentLoadException,

AgentInitializationException {

String name = ManagementFactory.getRuntimeMXBean().getName();

VirtualMachine vm = VirtualMachine.attach(name.substring(0,

name.indexOf('@')));

String lca = vm.getAgentProperties().getProperty(

"com.sun.management.jmxremote.localConnectorAddress");

if (lca == null) {

Path p = Paths.get(System.getProperty("java.home")).normalize();

if (!"jre".equals(p.getName(p.getNameCount() - 1).toString()

.toLowerCase())) {

p = p.resolve("jre");

}

File f = p.resolve("lib").resolve("management-agent.jar").toFile();

if (!f.exists()) {

throw new IOException("Management agent not found");

}

String options = String.format("com.sun.management.jmxremote.port=%d, " +

"com.sun.management.jmxremote.authenticate=false, " +

"com.sun.management.jmxremote.ssl=false", port);

vm.loadAgent(f.getCanonicalPath(), options);

lca = vm.getAgentProperties().getProperty(

"com.sun.management.jmxremote.localConnectorAddress");

}

vm.detach();

return lca;

}

This works in Eclipse however getting it to work at the command line is a different matter - there is some discussion about this here Why does using the Java Attach API fail on linux? (even though maven build completes)

but I found adding $JAVA_HOME/lib/tools.jar to my classpath solved the problem.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值