【问题标题】:Spring Boot Shutdown Hook terminated halfwaySpring Boot Shutdown Hook 中途终止
【发布时间】:2018-09-23 20:11:45
【问题描述】:

我已将 ShutDownHook 添加到我的 Spring Boot 应用程序中。当我将 SIGTERM 传递给我的应用程序时,关闭挂钩被触发,但它在中途终止,即在执行过程中。谷歌搜索并尝试了许多无法正常工作的解决方案。请高手帮帮我。

主类:

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);
        }
    }
}

我想要关闭挂钩来更新一些缓存以及一些消耗一些额外处理时间的逻辑。

当我尝试使用 'kill -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!

我正在使用嵌入式 Jetty 服务器。我还启用了 Jetty 日志,但仅在关闭时打印日志。我的期望是 applicationContext.close() 应该在 10 秒睡眠后调用,但线程在 10 秒后没有恢复。

当我尝试停止使用 systemctl 时,请找到以下日志。

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.

我开发了一个简单的带有关闭钩子的基本 java 程序,并尝试使用“kill -15”进行中断。关闭挂钩工作正常。

【问题讨论】:

  • 能分享一下日志吗
  • 你怎么知道它是“中途终止”?您是否收到任何错误消息或异常?请edit您的问题包括确切的错误消息,包括任何堆栈跟踪。
  • 看看stackoverflow.com/questions/26678208/spring-boot-shutdown-hook这个帖子对你有没有帮助。
  • 你为什么要自己注册?默认的关闭挂钩是否完全相同?此外,假设您使用的是 Web 应用程序,那么您在应用程序已经(或正在)关闭之后注册关闭挂钩。
  • @M.Deinum 我想要关闭挂钩来更新一些缓存以及一些消耗一些额外处理时间的逻辑。所以我需要关机钩子。

标签: java spring-boot shutdown-hook


【解决方案1】:

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

@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等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多