У меня есть программа, которая требует динамического (т. Е. Во время выполнения) открытия доступного сокета и запуска на нем агента JMX.Эти параметры JMX устанавливаются внутри кода Java, а не через командную строку.Это отлично работает.После этого необходимо осуществлять удаленный мониторинг (т.е. запускать команды JMX и т. Д.) Через Java Visual VM
Агент сервера 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.К сожалению, это не признается.Только свойства времени выполнения (т. Е. Указанные через командную строку распознаются для соединения JMX Java Visual VM).
Также встречался способ извлечения свойств из классов коллекции 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);
}
}
}
Любая помощь будет принята с благодарностью!