我正在实现一个JMX客户端,以便在使用JMX启用的服务器上执行某些任务。我正在多线程处理JMX客户端,并且对于每个请求,我尝试从JMXConnector获取新连接。即使我在打开一个新实例之前关闭了jmxconnector实例,它似乎也没有从先前的实例关闭套接字。 这就是我创建JMX实例的方法(我使用RMIClientSocketFactory来获取默认套接字):
JMXServiceURL jmxUrl = new JMXServiceURL(String.format(fmtUrl, host, port));
Map<String, Object> env = new HashMap<String, Object>();
if (userName != null) {
String[] creds = { userName, password };
env.put(JMXConnector.CREDENTIALS, creds);
}
env.put("com.sun.jndi.rmi.factory.socket", getRMIClientSocketFactory());
jmxc = JMXConnectorFactory.connect(jmxUrl, env);
我尝试创建的RMI套接字工厂如下:
private RMIClientSocketFactory getRMIClientSocketFactory() throws IOException {
if (Boolean.parseBoolean(System.getProperty("ssl.enable")))
return new SslRMIClientSocketFactory();
else {
return RMISocketFactory.getDefaultSocketFactory();
}
}
获取mbeanserver连接,完成任务并接收通知后,我将其关闭如下:
ssProxy.removeNotificationListener(runner);
jmxc.removeConnectionNotificationListener(runner);
jmxc.close();
但是,这似乎并没有删除底层套接字。
请你帮忙。