在普通的 Web Spring Boot (3.0.5) 应用程序上,如果这样做context.stop()
,然后context.start()
a 上的上下文会出现错误:
Exception in thread "main" org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
at org.springframework.context.support.DefaultLifecycleProcessor.start(DefaultLifecycleProcessor.java:103)
at org.springframework.context.support.AbstractApplicationContext.start(AbstractApplicationContext.java:1418)
at com.example.crac.springwebcrac.SpringWebCracApplication.main(SpringWebCracApplication.java:35)
Caused by: java.lang.IllegalStateException: The host does not contain a Context
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.findContext(TomcatWebServer.java:153)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:232)
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:44)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
要重现创建一个普通的 Web 启动应用程序,SpringWebCracApplication
如下所示:
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext context = SpringApplication.run(SpringWebCracApplication.class, args);
context.stop();
Thread.sleep(5000);
context.start();
}
看起来tomcat.destroy()
, 调用context.stop()
, 销毁了Tomcat.Context
, 并且后来在启动时没有重新创建。
请注意,如果我们将 替换Tomcat
为 a,Jetty
应用程序可以正常工作并在停止/启动后恢复。