Остановить \ запустить соединитель в моем коде - PullRequest
1 голос
/ 28 марта 2012

Мне нужно остановить и затем запустить соединитель https программно. В Tomcat 6 отлично работает следующий фрагмент кода:

        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");
        }

Но в Tomcat 7 (7.0.23) разъем не останавливается! Поэтому я вызвал метод destroy () (сразу после вызова метода stop ()), используя следующую строку кода: mbeanServer.invoke (objectName, "destroy", null, null);

В этом случае разъем действительно остановлен. Но когда я попытался запустить его, разъем не запустился, и я получил это исключение:

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)

Есть идеи, как я могу остановить, а затем запустить разъем в Tomcat 7? Предпочтительнее в изящной манере. Заранее спасибо, Guy

1 Ответ

2 голосов
/ 28 марта 2012

Это зависит от того, как вы определяете «стоп».По умолчанию Tomcat привязывается к порту во время init () и отменяет привязку при разрушении ().В случае по умолчанию stop () просто останавливает обработку новых соединений, но может не остановить эти соединения (в зависимости, среди прочего, от базовой ОС).

Вы можете получить лучшие результаты, если установите bindOnInit =«false» для соединителя в вашем server.xml.С этой настройкой порт будет привязан, когда start () вызывается как unbound, когда вызывается stop ().

...