如何通过 start-stop-daemon 优雅地关闭 Spring 引导应用程序

How to gracefuly shutdown a Spring Boot application by start-stop-daemon

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

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

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

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

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

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

@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###");
  }
}