我有一個程序需要動態地(即在運行時)打開一個可用的套接字並在其上啓動一個JMX代理。這個JMX參數是在Java代碼中設置的,而不是通過命令行設置的。這工作正常。此後它被需要監測(即問題JMX命令等)通過Java視覺VM 遠程如何通過java代碼設置JMX遠程端口系統環境參數進行遠程監控?
在程序中的RMI服務器代理上在所述的出盒管理的線: http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html
問題我已經可以概括爲: 如何這樣的命令行屬性被設置爲系統級 通過Java代碼,使得遠程分析可用於??
-Dcom.sun.management.jmxremote.port=1234
如果「jmxremote.port」等參數是通過命令行設置, 遠程監控工作正常。我正在嘗試通過Java 而不是通過命令行來找到一種方法。
程序無法通過命令行作爲新的可用端口指定端口具有在運行時計算出來。
流程需要遠程監控和在本地工作正常。 如果未在命令行指定以下參數,則Java Visual VM不會連接到該進程。
-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
我試過了。
System.setProperty("com.sun.management.jmxremote.port",Integer.toString(port));
這是啓動JMXConnectorServer之前在程序中完成的第一件事情之一。不幸的是它不被認可。只有運行時屬性(即,通過命令行指定的特性被Java Visual VM識別爲JMX連接)。
對面可以從Java集合類中提取的方式特性也來了,但未能達成如何跟蹤屬性「com.sun.management.jmxremote.port =」
public static void setEnv(Map<String, String> newenv) throws Exception {
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> 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<String, String> map = (Map<String, String>) obj;
//map.clear();
map.putAll(newenv);
}
}
}
任何幫助,將不勝感激!
你應該修改你原來的問題,其中包括代碼示例,您已經在評論被張貼。 – Perception