Spring , JPA

Spring Boot , Java Application Graceful Shutdown

seulseul 2023. 3. 13. 22:23

1. Spring Boot Graceful Shudown

Spring Boot는 자동으로 Graceful Shutdown을 지원하지 않으므로, 설정이 필요하다.

Spring Boot 2.3 부터 Spring Boot는 이제 서블릿 및 반응형 플랫폼 모두에서 4개의 임베디드 웹 서버(Tomcat, Jetty, Undertow 및 Netty) 모두에 대해 정상적인 종료 기능을 지원한다.
 
정상적인 종료를 활성화하려면 application.yml 파일에서 server.shutdown 속성을 graceful  로  설정하기만 하면 된다.

 

application.yml example (1)

server.shutdown: graceful

그런 다음 Tomcat, Netty 및 Jetty는 네트워크 계층에서 새 요청 수락을 중지한다.
반면에 Undertow는 계속해서 새로운 요청을 수락하지만 즉시 503 Service Unavailable 응답을 클라이언트에 보낸다.
기본적으로 이 속성의 값은 즉시 와 동일하며 이는 서버가 즉시 종료됨을 의미한다.

제한 시간을 구성하려면 spring.lifecycle.timeout-per-shutdown-phase 속성을 아래 예와 같이 구성해야한다.

 

application.yml example (2)

spring.lifecycle.timeout-per-shutdown-phase: "20s"

Spring Boot 2.3 이하버전

spring boot actuator 을 이용하여  graceful shutdown 을 구현할 수 있다.
 

2. Spring Framework 에서 Gracefule Shutdown 구현하는 방법

일반 스프링 애플리케이션 (Spring Framework)
웹앱에서 Tomcat이 다운되기 전에 반응하려는 경우 ServletContextListener를 구현

ServletContextListener ?

  • 웹 컨테이너는 웹 어플리케이션(컨텍스트)이 시작,종료되는 시점에 특정 클래스의 메서드를 실행할 수 있는 기능을 제공한다.
  • 이 기능을 통해 웹 어플리케이션 실행시 필요한 초기화 작업 또는 종료된 후 사용된 자원을 반환하는 작업 등을 수행한다.

웹 어플리케이션 시작,종료시 특정 기능을 실행하는 방법

1) javax.servlet.ServletContextListener 인터페이스를 구현한 클래스를 작성한다.

2) web.xml 파일에 1번에서 작성한 클래스를 등록한다.

 

3. Generic Java application 에서 Gracefule Shutdown 구현하는 방법

Java application 은 다운 되기 전에 JVM이 반드시, 실행해야만 하는 shutdown hook을 추가할수 있다.

Thread printingHook = new Thread(() -> System.out.println("In the middle of a shutdown"));
Runtime.getRuntime().addShutdownHook(printingHook);
> System.exit(129);
In the middle of a shutdown

 

[관련 포스팅]

Linux 에서 정상적으로 프로세스를 중지하는 방법, Graceful Shutdown

 


참고

Spring 공식문서 - Graceful Shutdown

Adding Graceful shutdown in Java application

[baeldung] JVM Shutdown Hook

셧다운 후크를 사용한 어플리케이션의 안전한 종료 처리

'Spring , JPA' 카테고리의 다른 글

Spring Cloud OpenFeign 사용법  (0) 2023.11.12
Spring Boot Logging (log4j, logback, log4j2)  (0) 2023.07.09
[spring] Spring Webflux 란?  (0) 2023.01.17
[spring] Spring Webflux CRUD  (0) 2023.01.16
[kafka] kafka Install  (0) 2023.01.09