tomcat - 在我的代码中停止\启动连接器

标签 tomcat connector

我需要以编程方式停止然后启动 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 中停止然后启动连接器的任何想法?最好以优雅的方式。 提前致谢, 盖伊

最佳答案

这取决于您如何定义“停止”。默认情况下,Tomcat 在 init() 期间绑定(bind)到端口并在 destroy() 期间取消绑定(bind)。在默认情况下,stop() 只是停止处理新连接,但它可能不会停止正在建立的连接(取决于 - 除其他事项外 - 底层操作系统)。

如果在 server.xml 中为连接器设置 bindOnInit="false",您可能会获得更好的结果。使用此设置,当调用 start() 时端口将被绑定(bind),而当调用 stop() 时端口将被绑定(bind)。

关于tomcat - 在我的代码中停止\启动连接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9912585/

相关文章:

tomcat - liferay 6.1 和 Tomcat 7 - 更改端口

java - 如何优雅地停止嵌入式 Tomcat 并且只有在当前处理请求必须完成后才能停止 tomcat

java - Tomcat 如何知道我的 IntelliJ webapp war 文件在 Mac 上的位置?

java - Spring Initializr 为 tomcat 创建 WAR?

c# - Linux 上带有 MySql 连接器的 .Net 应用程序

java - 为什么在我启动服务器时 Tomcat 不启动连接器?

c++ - MySQL 连接器和 VC2010 header 冲突

java - 运行 gwt 开发模式时的服务器端测试用例

tomcat - 自定义 JMXAuthenticator 和 Tomcat?