2013-02-07 1 views
0

우리는 우리의 아키텍처에서 여러 서버 측 구성 요소가 있습니다. 각 컴포넌트는 JMX를 사용하여 다양한 내부 속성을 노출합니다. 초기화는 다음과 같이 수행됩니다.는 LocateRegistry.createRegistry (INT 포트) 자바 1.7에서 변경 했습니까?

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. 더 큰 질문은 Java 1.6에서 잘 실행되는 반면 (호스트에서 각 후속 서버는 포트를 사용할 수없는 경우 LocateRegistry.createRegistry (i) 예외를 throw하므로) 사용 가능한 다음 포트를 사용합니다. 1.7. 두 번째 서버는() JMXConnectorServer.start에 시도 할 때 그 결과, 우리는 다음과 같은 예외를 얻을. 누구든지 createRegistry에 대한 동작이 변경된 경우 알 수 있습니까? 그렇다면 우리가해야 할 일이 있습니까?

    2013-02-07 15:34:28,451 INFO [main] Using JMX port: 9500 
    2013-02-07 15:34:28,929 ERROR [main] Unable to register MBean with JMX 
    java.io.IOException: Cannot bind to URL [rmi://:9500/jmxrmi]: javax.naming.NameAlreadyBoundException: jmxrmi [Root exception is java.rmi.AlreadyBoundException: jmxrmi] 
         at javax.management.remote.rmi.RMIConnectorServer.newIOException(RMIConnectorServe.java:826) 
    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) 
    Caused by: javax.naming.NameAlreadyBoundException: jmxrmi [Root exception is 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) 
    at javax.management.remote.rmi.RMIConnectorServer.bind(RMIConnectorServer.java:643) 
    at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:426) 
    ... 3 more 
    Caused by: java.rmi.AlreadyBoundException: jmxrmi 
    at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:131) 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:390) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248) 
    at sun.rmi.transport.Transport$1.run(Transport.java:159) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 
    at 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) 
    at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:137) 
    ... 7 more 
    

답변

0

이 잘 보입니까? 여러 가지 이유로 실패 할 수 있습니다 레지스트리를 만들기

  • 번호, 포트가 사용 중입니다뿐만 아니라 때문이다.
  • registry
  • createRegistry() 후 널 (null), 그래서 그것을 테스트하는 것은 무의미 할 수 없다.
  • 그냥 개방 (및 닫기) 무료 포트,ServerSocket()을 찾기 위해 노력하는 경우. 이 일 경우 그런 다음 해당 포트에서 레지스트리를 만들 수 있습니다.

이 자바 1.6에 잘 실행되는 동안 더 큰 문제는, (포트를 사용할 수없는 경우 LocateRegistry.createRegistry (내가) 예외가 발생하기 때문에 호스트에서 이후의 각 서버가 사용 가능한 다음 포트를 사용)되고, 1.7.

위 참조. 레지스트리 생성은 JDK에서 이미 해당 포트에서 실행중인 경우에도 실패 할 수 있습니다. 이전 JDK에서는 동일한 JVM의 포트에서 실행중인 JDK가있는 경우 실패합니다.