当前位置: 首页 > 知识库问答 >
问题:

Spring引导关闭钩半路终止

濮丁雷
2023-03-14

我已经将ShutDownHook添加到我的Spring Boot应用程序中。当我将SIGTERM传递给我的应用程序时,shutdown钩子被触发,但它在中途终止,即在执行过程中终止。谷歌了它,尝试了很多解决方案,但都不起作用。一些专家,请帮我一下。

ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(MyApp.class)
            .profiles("default")
            .registerShutdownHook(false)
            .build()
            .run(args);
    Runtime.getRuntime().addShutdownHook(new Thread(new GracefulShutdownHook(applicationContext)));

GracefulShutdownHook类:

public class GracefulShutdownHook implements Runnable {
    private final ConfigurableApplicationContext applicationContext;

    public GracefulShutdownHook(ConfigurableApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public void run() {
        try {
            log.info("Gonna wait for 5 seconds before shutdown SpringContext!");
            Thread.sleep(5 * 1000);
            log.info("Spring Application context starting to shutdown");
            applicationContext.close();
            log.info("Spring Application context is shutdown");
        } catch (InterruptedException e) {
            log.error("Error while gracefulshutdown Thread.sleep", e);
        }
    }
}

我想让关机钩子更新一些缓存和一些逻辑,这会消耗一些额外的处理时间。

当我尝试使用“杀戮-15”杀戮时的日志:

Apr 13 10:08:22 ssed java[14354]: 2018-04-13T10:08:22,778 INFO  [c.o.GracefulShutdownHook] -- Gonna wait for 10 seconds before shutdown SpringContext!
Apr 12 15:24:51 vm33 systemd[1]: Stopping Session Application Service...
Apr 12 15:24:51 vm33 java[29538]: 2018-04-12T15:24:51,421 INFO  [c.o.GracefulShutdownHook] -- Gonna wait for 10 seconds before shutdown SpringContext!
Apr 12 15:25:01 vm33 systemd[1]: Stopped Session Application Service.

共有1个答案

钱钊
2023-03-14

您可以添加以下代码在关机时执行操作:

@RestController
@Slf4j
public class GetDataController {

  //your code

  @PreDestroy
  public void onExit() {
    log.info("###STOPing controller ##");
    try {
      Thread.sleep(5 * 1000);
    } catch (InterruptedException e) {
      log.error("", e);;
    }
    log.info("###STOP FROM THE LIFECYCLE controller###");
  }
}

@RestController可以是其他类型的,如@Component@SpringBootApplication等等。

 类似资料:
  • 我如何注册/添加一个自定义的关闭例程,当我的Spring Boot应用程序关闭时,该例程将被触发? 场景:我将Spring Boot应用程序部署到一个Jetty servlet容器(即,没有嵌入式Jetty)。我的应用程序使用Logback进行日志记录,并且我希望在运行时使用Logback的MBean JMX配置器更改日志记录级别。它的文档说明,为了避免内存泄漏,在关机时必须调用特定的Logger

  • 我阅读了如何以正确的方式关闭一个Spring Boot应用程序?,所以我尝试使用http关闭endpoint来关闭我的Spring Boot嵌入式tomcat应用程序。 有没有办法只挂起关闭endpoint,这样我就可以检查请求者IP了?

  • 我有一个Spring Boot应用程序在负载均衡器后面的两个服务器上运行。 我定义了一个shutdown挂钩,它将应用程序中的/healthcheckendpoint设置为返回404错误,等待30秒以完成所有操作,然后停止JVM。负载均衡器被配置为在看到404错误时将服务器置于维护模式。(这与“down”状态不同--飞行中的连接允许在维护模式下完成)

  • 问: 为什么我关闭了终端,Workerman就自己关闭了? 答: Workerman有两种启动模式,debug调试模式和daemon守护进程模式。 运行 php xxx.php start 是进入debug调试模式,用于开发调试问题,当终端关闭后Workerman会随之关闭。 运行 php xxx.php start -d进入的是daemon守护进程模式,终端关闭不会影响Workerman。 如果

  • 我想关闭Spring Boot应用程序控制台上的调试输出。我希望有一个默认的信息记录。但事实并非如此。我试图用暴力来关闭关卡https://mkyong.com/spring-boot/spring-boot-log4j-2-example/我不喜欢这个,现在它甚至不工作。在如何在spring boot中关闭调试日志消息中,这被标记为解决方案。我想不是。我将我的项目减少到最小,并在多种设置中得到此

  • 问题内容: 我只是不明白为什么必须使用Runtime.addShutdownHook。如果要在jvm退出时进行一些清理,为什么不重载daemon类的finalize方法。使用shutdown钩子而不是finalize方法的好处是什么。 还有一个不赞成使用的函数runFinalizersOnExit。如果将其设置为false,我相信终结器将不会运行。这与java保证终结器始终在垃圾回收之前运行是矛盾