web-dev-qa-db-ja.com

start-stop-daemonでSpring Bootアプリケーションを正常にシャットダウンする方法

Linuxマシン上でデーモンとして実行されるマルチスレッドのSpring Bootアプリケーションがあります。このようなstart-stop-daemonでアプリケーションを停止しようとすると

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

SIGTERMシグナルが送信され、アプリケーションはすぐに終了します。ただし、すべてのスレッドが作業を完了するまで、アプリケーションを待機させたい。

SIGTERMシグナルを受信したときに何が起こるかを管理する方法はありますか?

9
Michal

Spring Bootアプリは、シャットダウンフックをJVMに登録して、ApplicationContextが終了時に正常に閉じられるようにします。 DisposableBeanを実装する、または@PreDestroyアノテーション。このBeanはアプリのシャットダウン時に呼び出されます。

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

15
Evgeny

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