我们的架构中有几个服务器端组件。每个组件都使用JMX公开各种内部属性。初始化如下:
try {
Registry registry = null;
for(int i = _serverInfo.getJMXStartPort(); i <= _serverInfo.getJMXEndPort(); i++) {
try {
registry = LocateRegistry.createRegistry(i);
if(registry != null) {
_statusPort = i;
logger.info("Using JMX port: "+_statusPort);
break;
}
} catch (Exception e) {
_statusPort++;
}
}
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
_abstractServiceController = new AbstractServiceController(this);
ObjectName mbeanName = new ObjectName("MyServer:name=MyServer Service");
mbs.registerMBean(_abstractServiceController, mbeanName);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:"+_statusPort+"/jmxrmi");
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, System.getenv(), mbs);
cs.start();
} catch (Throwable e) {
logger.error("Unable to register MBean with JMX");
e.printStackTrace();
}我想我有两个问题。
发布于 2013-02-08 00:34:32
这个看起来对吗?
registry不能在createRegistry()之后为null,因此对其进行测试是毫无意义的。ServerSocket()。然后在该端口上创建注册表,如果可以的话。更大的问题是,虽然这在java1.6上运行得很好(主机上的每个后续服务器都使用下一个可用端口,因为如果端口不可用,LocateRegistry.createRegistry(i)抛出异常),而不是1.7。
请参见上面的。如果在任何JDK中已在该端口上运行一个注册表,则创建注册表也可能失败。在早期的JDK中,如果在同一个JVM中的任何端口上都有一个运行,它就会失败。
https://stackoverflow.com/questions/14760645
复制相似问题