11

我们有一个多线程 Spring Boot 应用程序,它作为守护进程在 Linux 机器上运行。当我尝试像这样通过 start-stop-daemon 停止应用程序时

start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME

发送 SIGTERM 信号,应用程序立即结束。但是我希望应用程序等待,直到每个线程完成它的工作。

当收到 SIGTERM 信号时,有什么办法可以管理发生的事情?

4

2 回答 2

18

Spring Boot 应用程序向 JVM 注册了一个关闭挂钩,以确保ApplicationContext在退出时正常关闭。创建实现DisposableBean或具有带有@PreDestroy注释的方法的bean(或bean)。此 bean 将在应用程序关闭时调用。

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-exit

于 2016-04-18T10:59:51.033 回答
4

@Evgeny 提到的样本

@SpringBootApplication
@Slf4j
public class SpringBootShutdownHookApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringBootShutdownHookApplication.class, args);
  }

  @PreDestroy
  public void onExit() {
    log.info("###STOPing###");
    try {
      Thread.sleep(5 * 1000);
    } catch (InterruptedException e) {
      log.error("", e);;
    }
    log.info("###STOP FROM THE LIFECYCLE###");
  }
}
于 2018-11-19T07:32:31.550 回答