如何获取平台MBeanServer的JMXConnectorServer?

时间:2014-04-24 15:39:22

标签: java concurrency jmx

我有一个提供服务的Java程序,可以通过RMI调用JMX MBean上的方法来调用这些服务。该服务运行没有问题,但我面临的问题是如何在不中断对服务的潜在新并发请求的情况下关闭服务。

此问题的一个解决方案是等待所有JMX连接关闭,然后才会关闭(并且当没有更多后台活动时)关闭进程。 JMXConnectorServer有一个方法getConnectionIds()我可以用它,但我已经遇到了以下问题:

如何获取平台MBean服务器的JMXConnectorServer实例,即ManagementFactory.getPlatformMBeanServer()返回的服务器?

1 个答案:

答案 0 :(得分:0)

AFAIK,无法获取由JMXConnectorServer自动创建的getPlatformMBeanServer(),但您可以使平台MBean服务器使用您自己创建的连接器服务器实例。

执行此操作时,com.sun.management.jmxremote*系统属性取消设置非常重要,这样平台MBean服务器不会自动设置连接器服务器。

示例:如果您使用系统属性

配置了JMX远程访问
-Dcom.sun.management.jmxremote.port=1919
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

使用以下代码删除这些系统属性并以编程方式配置您自己的连接器服务器:

int jmxPort = 1919;
LocateRegistry.createRegistry(jmxPort);

MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
// or: MBeanServer beanServer = MBeanServerFactory.createMBeanServer(); // doesn't register the default platform MBeans

JMXServiceURL jmxUrl 
    = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + jmxPort + "/jmxrmi");
JMXConnectorServer connectorServer
    = JMXConnectorServerFactory.newJMXConnectorServer(jmxUrl, null, beanServer);

connectorServer.start();

当您要使用身份验证和SSL时,此tech note from Oracle包含另一个手动连接器服务器设置示例。