2012-03-28 1 views
1

프로그래밍 방식으로 https 커넥터를 중지했다가 시작해야합니다. 는 바람둥이 6에서 다음 코드 스크랩 잘 작동합니다 : 내 코드 내에서 start 커넥터를 중지하십시오.

 final ObjectName objectNameQuery = new ObjectName("*:type=Connector,port=443,*"); 
     MBeanServer  mbeanServer = null; 
     ObjectName  objectName = null; 

     for (final MBeanServer server : (List<MBeanServer>) MBeanServerFactory.findMBeanServer(null)) 
     { 
      if (server.queryNames(objectNameQuery, null).size() > 0) 
      { 
       mbeanServer  = server; 
       objectName  = (ObjectName) server.queryNames(objectNameQuery, null).toArray()[0]; 

       break; 
      } 
     } 

     // now we restart the connector that we just found. We sleep a little, but I am 
     // not actually sure 1) how long we should sleep for or 2) if sleeping is 
     // necessary at all. 
     if (mbeanServer != null) 
     { 
      mbeanServer.invoke(objectName, "stop", null, null);     

      Thread.sleep(waitForStopInSec * 1000); 

      mbeanServer.invoke(objectName, "start", null, null); 

      log.warn("https Connector was restarted"); 
     } 

그러나 바람둥이 7 (7.0.23)에

커넥터가 중지되지 않습니다! 따라서 다음 코드 줄을 사용하여 destroy() 메서드를 호출 한 직후 stop() 메서드를 호출합니다. mbeanServer.invoke (objectName, "destroy", null, null);

이 경우 커넥터가 실제로 멈 춥니 다. 내가 그것을 시작하려고하지만, 커넥터가 시작되지 않았고 나는이 예외 가지고 : 나는 중지하고 바람둥이 7 커넥터를 시작할 수있는 방법

28/03/12 18:32:01 ERROR T:CommServerScheduler_Worker-1 TrustStoreRefreshJob.refreshHTTPSConnectors - failed to restart connector 
javax.management.InstanceNotFoundException: Catalina:type=Connector,port=443,address="/192.168.201.24" 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1094) 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:833) 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) 
    at tool.security.TrustStoreRefreshJob.refreshHTTPSConnectors(TrustStoreRefreshJob.java:79) 
    at tool.security.TrustStoreRefreshJob.executeJob(TrustStoreRefreshJob.java:32) 
    at com.nextnine.common.scheduler.AbstractJobLogic.execute(AbstractJobLogic.java:47) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 

어떤 아이디어? 우아한 방식으로 바람직합니다. 미리 감사드립니다. 가이

답변

2

"정지"를 정의하는 방법에 따라 다릅니다. 기본적으로 Tomcat은 init() 중에 포트에 바인드하고 destroy() 중에 바인드 해제합니다. 디폴트의 ​​경우, stop()은 새로운 접속의 처리를 멈추지 만, (다른 것의 경우에 따라서는 기본 OS에 따라서) 접속이 중단되는 것을 막을 수 없다.

server.xml의 커넥터에 대해 bindOnInit = "false"로 설정하면 더 나은 결과를 얻을 수 있습니다. 이 설정을 사용하면 stop()이 호출 될 때 start()가 언 바운드 호출 될 때 포트가 바인딩됩니다.

+0

마크, 응답 해 주셔서 감사합니다. 커넥터를 시작()하고 중지()해야합니까? 내 게시물 에서처럼 커넥터 MBean에서 작업을 사용합니까? 아니면 더 좋은 방법이 있을까요? – Guy

+0

당신이하고있는 방식대로 작동합니다. 가능한 한 더 좋은 방법은 JMX를 사용하지 않고 실제 커넥터 객체에 대한 참조를 확보하는 것입니다. 이것이 얼마나 쉬운지는 정확히 Tomcat 인스턴스를 시작하는 방법에 달려 있습니다. –

+0

좋은데, "Tomcat 인스턴스를 시작하는 방법"이라고 말하면 무엇을 의미하는지 이해할 수는 없지만 ... 어떻게 커넥터를 얻을 수 있습니까? 어쩌면 청취자 (ServletContextListener)를 통해? – Guy

관련 문제