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
'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 |