【问题标题】:Graceful shutdown fails优雅关机失败
【发布时间】:2020-12-01 12:05:59
【问题描述】:

我有一个带有 server.shutdown=graceful 的 spring boot 2.3+ 应用程序,当它被关闭时抛出:

 2020-11-30 11:07:35.485  WARN 3038 --- [SpringContextShutdownHook] o.s.c.support.DefaultLifecycleProcessor  : Failed to stop bean 'webServerGracefulShutdown'
 
 java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: org/springframework/boot/web/server/GracefulShutdownResult
     at org.springframework.boot.web.servlet.context.WebServerGracefulShutdownLifecycle.stop(WebServerGracefulShutdownLifecycle.java:51)
     at org.springframework.context.support.DefaultLifecycleProcessor.doStop(DefaultLifecycleProcessor.java:238)
     at org.springframework.context.support.DefaultLifecycleProcessor.access$300(DefaultLifecycleProcessor.java:53)
     at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.stop(DefaultLifecycleProcessor.java:377)
     at org.springframework.context.support.DefaultLifecycleProcessor.stopBeans(DefaultLifecycleProcessor.java:210)
     at org.springframework.context.support.DefaultLifecycleProcessor.onClose(DefaultLifecycleProcessor.java:128)
     at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1022)
     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.doClose(ServletWebServerApplicationContext.java:170)
     at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:949)
 Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/web/server/GracefulShutdownResult
     ... 9 common frames omitted
 Caused by: java.lang.ClassNotFoundException: org.springframework.boot.web.server.GracefulShutdownResult
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
     at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     ... 9 common frames omitted
 
 2020-11-30 11:08:05.486  INFO 3038 --- [SpringContextShutdownHook] o.s.c.support.DefaultLifecycleProcessor  : Failed to shut down 1 bean with phase value 2147483647 within timeout of 30000ms: [webServerGracefulShutdown]
 2020-11-30 11:08:35.514  INFO 3038 --- [SpringContextShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
 2020-11-30 11:08:35.519  INFO 3038 --- [SpringContextShutdownHook] o.s.s.c.ThreadPoolTaskScheduler          : Shutting down ExecutorService 'taskScheduler'
 2020-11-30 11:08:35.520  INFO 3038 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
 2020-11-30 11:08:35.528  INFO 3038 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
 2020-11-30 11:08:35.530  INFO 3038 --- [SpringContextShutdownHook] o.s.s.c.ThreadPoolTaskScheduler          : Shutting down ExecutorService

最终应用程序关闭,但不是正常关闭,并且由于从部署脚本调用关闭,脚本失败,由于退出代码!= 0 应用程序的关闭调用。

这可能是什么原因?我想我没有长时间运行的任务,这可能会导致这种情况,但我该如何检查呢?

【问题讨论】:

  • 在调用shutdown api之前是否更换了jar或者重命名了jar?
  • 好吧,server.shutdown=graceful 设置在 application.properties 中被捆绑到 jar 中。如果启用此设置,则更换 jar。
  • 尝试在更换 jar 之前调用 shutdown 看看会发生什么。
  • @Shawrup,谢谢,这就是问题所在。现在修好了。您愿意将其转换为答案吗?
  • 当然,我会为这个问题写一个回答。

标签: spring-boot shutdown


【解决方案1】:

如果您在 jar 仍在运行时替换或重命名 jar,则可能会发生此问题。 Java 在启动时不会将整个 jar 放在内存中,而是在需要加载某些类时使用 Jar 中的类的引用。但是重命名 jar 或替换 jar 可能会弄乱 Jar 中的类引用。所以 java 不会在运行时找到你想加载的类,你会看到这个ClassNotFoundException

Possible workaround: 在替换或重命名 jar 之前尝试关闭应用程序。

【讨论】:

    【解决方案2】:

    我们在 git 实验室管道中遇到了同样的问题,我已更改管道以先停止现有应用程序,然后替换新的 jar 文件。希望这能解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多