Linuxマシン上でデーモンとして実行されるマルチスレッドのSpring Bootアプリケーションがあります。このようなstart-stop-daemonでアプリケーションを停止しようとすると
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
SIGTERMシグナルが送信され、アプリケーションはすぐに終了します。ただし、すべてのスレッドが作業を完了するまで、アプリケーションを待機させたい。
SIGTERMシグナルを受信したときに何が起こるかを管理する方法はありますか?
Spring Bootアプリは、シャットダウンフックをJVMに登録して、ApplicationContext
が終了時に正常に閉じられるようにします。 DisposableBean
を実装する、または@PreDestroy
アノテーション。このBeanはアプリのシャットダウン時に呼び出されます。
@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###");
}
}