首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LocateRegistry.createRegistry(int端口)在java1.7中有更改吗?

LocateRegistry.createRegistry(int端口)在java1.7中有更改吗?
EN

Stack Overflow用户
提问于 2013-02-07 20:45:04
回答 1查看 1.2K关注 0票数 0

我们的架构中有几个服务器端组件。每个组件都使用JMX公开各种内部属性。初始化如下:

代码语言:javascript
复制
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();
    }

我想我有两个问题。

  1. 这个看起来对吗?
  2. 更大的问题是,虽然这在java1.6上运行得很好(主机上的每个后续服务器都使用下一个可用端口,因为如果端口不可用,LocateRegistry.createRegistry(i)抛出异常),而不是1.7。因此,当第二台服务器尝试JMXConnectorServer.start()时,我们会得到以下异常。有人知道createRegistry的行为是否发生了变化吗?如果是的话,我们还应该做些什么吗? 2013-02-07 15:34:28,451 INFO main使用JMX端口: 9500 2013-02-07 15:34:28,929错误main无法向JMX注册javax.management.remote.rmi.RMIConnectorServer.newIOException(RMIConnectorServe.java:826) java.io.IOException:无法绑定到URL rmi://:9500/ jmxrmi : javax.naming.NameAlreadyBoundException: jmxrmi根例外是java.rmi.AlreadyBoundException: jmxrmi at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:431) at com.theatre.services。framework.AbstractService.run(AbstractService.java:306) at com.theatre.services.reporttree.TreeServerImpl.run(TreeServerImpl.java:690) at com.theatre.services.framework.Launcher.main(Launcher.java:99)引起的: javax.naming.NameAlreadyBoundException: jmxrmi根异常是java.rmi.AlreadyBoundException: jmxrmi at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:139) at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:226) at javax.naming.InitialContext.bind(InitialContext.java:419)在javax.management.remote.rmi.RMIConnectorServer.bind(RMIConnectorServer.java:643) at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:426) .3引起的: java.rmi.AlreadyBoundException: jmxrmi at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:131) at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)在sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:390) at sun.rmi.server.UnicastServerRef。调度( sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method)在sun.rmi.transport.Transport.serviceCall(Transport.java:155)在sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)在java.util.concurrent.ThreadPoolExecutor$Worker.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)在sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)的runTask(ThreadPoolExecutor.java:886)绑定(RegistryContext.java:137).7
EN

回答 1

Stack Overflow用户

发布于 2013-02-08 00:34:32

这个看起来对吗?

  • 不是的。创建注册表可能会因为以下几个原因而失败,而不仅仅是因为端口正在使用。
  • registry不能在createRegistry()之后为null,因此对其进行测试是毫无意义的。
  • 如果您试图找到一个自由端口,只需打开(并关闭)一个ServerSocket()。然后在该端口上创建注册表,如果可以的话。

更大的问题是,虽然这在java1.6上运行得很好(主机上的每个后续服务器都使用下一个可用端口,因为如果端口不可用,LocateRegistry.createRegistry(i)抛出异常),而不是1.7。

请参见上面的。如果在任何JDK中已在该端口上运行一个注册表,则创建注册表也可能失败。在早期的JDK中,如果在同一个JVM中的任何端口上都有一个运行,它就会失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14760645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档