如何获取平台MBeanServer的JMXConnectorServer?

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

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

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

AFAIK,无法获取由getPlatformMBeanServer()自动创建的JMXConnectorServer ,但您可以使平台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(); 

来自Oracle的技术说明包含另一个用于手动连接器服务器设置的示例,当您要使用身份validation和SSL时。