【发布时间】: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 运行的“正确”方法是什么?
【问题讨论】: