【问题标题】:Tomcat 9 complains about starting twice if I call connector.start()?如果我调用 connector.start(),Tomcat 9 会抱怨启动两次?
【发布时间】:2021-06-23 22:28:04
【问题描述】:

我有一个可用的 Tomcat 8 + Spring 5 示例,这里:https://github.com/shorn/turnip/blob/8d73815ae361241ec3b4e8c71e2bb474898b9f06/src/main/java/turnip/App.java

您可以在日志中看到 Tomcat 正在侦听端口 8080:

Mar 27, 2021 2:01:33 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Initializing Servlet 'dispatcher'
Mar 27, 2021 2:01:33 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Completed initialization in 6 ms
Mar 27, 2021 2:01:33 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]

但是当我升级到Tomcat 9时,启动过程并没有初始化协议监听器:

Mar 27, 2021 2:10:14 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Initializing Servlet 'dispatcher'
Mar 27, 2021 2:10:14 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Completed initialization in 6 ms

这是日志中的最后几行,它就在那里;当我尝试连接浏览器时,Tomcat 不接受端口 8080 上的连接。

然后我添加了这段代码来“启动”协议侦听器:

tomcat.getConnector().start();

这可行,Tomcat 现在正在侦听连接,而 Spring 正在为我的端点提供服务。

但现在 Tomcat 在启动日志中显示一条关于两次调用 start() 的消息:

Mar 27, 2021 2:16:16 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Initializing Servlet 'dispatcher'
Mar 27, 2021 2:16:16 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Completed initialization in 7 ms
Mar 27, 2021 2:16:16 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Mar 27, 2021 2:16:16 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Mar 27, 2021 2:16:16 PM org.apache.catalina.util.LifecycleBase start
INFO: The start() method was called on component [Connector[HTTP/1.1-8080]] after start() had already been called. The second call will be ignored.

为什么默认情况下 Tomcat 9 不能正确监听连接,让嵌入式 Tomcat 9 运行的“正确”方法是什么?

【问题讨论】:

    标签: tomcat tomcat9


    【解决方案1】:

    在调用Tomcat#start() 之前,您应该调用Tomcat#getConnector() 以了解创建Connector副作用。不要在返回的连接器上调用start() 方法,启动序列会为您完成。

    恕我直言,这是一个错误,因为所有那些充满副作用的 "getters" 都应该由 Tomcat#start() 方法调用。

    编辑:挖个小北斗,缺少默认连接器是Tomcat 9.0.0.M14 中的有意更改,作为对this regression bug report 的反应。

    如果我正确地解释了开发者的意图,您应该自己使用以下方法创建连接器:

            Connector connector = new Connector("HTTP/1.1");
            connector.setPort(port);
            tomcat.setConnector(connector);
    

    虽然目前tomcat.getConnector() 具有相同的副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多