Может ли кто-нибудь дать мне несколько руководств о том, как получить свойства JVM после того, как я создал JMX-соединение с ним? Мне нужно получить эту информацию программно. Я искал это, не получив намека. Любые мысли были бы оценены.
Посмотрите учебник JMX и примеры.
Свойства, которые вы хотите получить, можно получить в RuntimeMXBean.
Ни один из ответов, которые уже были предоставлены, действительно сработал для меня. Некоторые проблемы, которые у меня были с ними:
JMX.newMXBeanProxy
выглядело многообещающим, чтобы избежать всей этой распаковки. Но хотя он компилируется... во время выполнения, я обнаружил, что результат из proxy getSystemProperties
самом деле фактически не распакован. Он по-прежнему является объектом TabularDataSupport
(да, хотя его тип времени компиляции говорит, что он должен быть Map<String,String>
, на самом деле это не так). Итак, вот что-то, что на самом деле работает для меня со всеми этими ловушками, разработанными таким образом, чтобы они отображали свойства системы как Map<String,String>
же, как вы, вероятно, захотите.
package example;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Map;
import java.util.Map.Entry;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class GetJmxSystemProps {
public static void main(String[] args) throws Exception {
JMXServiceURL serviceUrl = new JMXServiceURL("service:jmx:rmi://localhost:9111/jndi/rmi://localhost:9111/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
RuntimeMXBean proxy = ManagementFactory.getPlatformMXBean(connection, RuntimeMXBean.class);
Map<String, String> sysprops = proxy.getSystemProperties();
for (Entry<String, String> e : sysprops.entrySet()) {
System.out.println(e.getKey()+"="+e.getValue());
}
}
}
Подводя итог: ключевым моментом здесь является то, что использование JMX.newMXBeanProxy
для получения компонента типа RuntimeMXBean
выполняется с RuntimeMXBean
и не распаковывает объект TabularDataSupport
в Map<String,String>
правильно. Эту проблему можно избежать, используя вместо этого метод ManagementFactory.getPlatformMXBean
.
В качестве подсказки: после подключения к JMX мне кажется, что существует стандартный интерфейс MXBean
, который реализует java.lang.management.RuntimeMXBean
. Связанное ObjectName
должно быть:
ObjectName objName = new ObjectName("java.lang:type=Runtime");
и получение объекта экземпляра прокси выглядит так:
RuntimeMXBean runtimeMXBean = JMX.newMXBeanProxy(mbeanServer, objName, RuntimeMXBean.class, true);
Может быть, это поможет кому-то другому.
NB. Если кто-то может предоставить ссылку на документацию, которая указывает на необходимость интерфейса RuntimeMXBean
для JMX-совместимых систем, то это будет приветствоваться.
runtimeMXBean.getSystemProperties
он возвращает что-то, что на самом деле не является Map<String,String>
(оно типизируется как таковое компилятором, а что-то другое во время выполнения). Я думаю, что использование JMX.newMXBeanProxy
виновато в этом. Вместо этого мы должны использовать ManagementFactory.getPlatformMXBean
чтобы получить прокси, который правильно распаковывает данные.
Я думаю, что самый маленький пример должен выглядеть так:
public class JMXSystemProperties {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
TabularDataSupport data = (TabularDataSupport) mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "SystemProperties");
for (Entry<Object, Object> entry : data.entrySet()) {
CompositeDataSupport value = (CompositeDataSupport) entry.getValue();
System.out.println(entry.getKey() + " = " + value.values());
}
}
}
Вы все равно можете использовать jvisualvm, чтобы убедиться, что все данные верны.
Вы можете заменить localhost и порт 9004 в URL-адресе на сервер и порт, который лучше для вас.
благодаря