Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- PETERICA
- CKA
- CKA 기출문제
- 티스토리챌린지
- IntelliJ
- Pinpoint
- MySQL
- APM
- 코틀린 코루틴의 정석
- Kubernetes
- kotlin coroutine
- 정보처리기사실기 기출문제
- AWS EKS
- mysql 튜닝
- kotlin spring
- Java
- Spring
- CloudWatch
- aws
- 공부
- 정보처리기사 실기 기출문제
- kotlin
- AI
- Linux
- 오블완
- 정보처리기사 실기
- Elasticsearch
- kotlin querydsl
- minikube
- 기록으로 실력을 쌓자
Archives
- Today
- Total
피터의 개발이야기
[SpringBoot] SpringBoot-Tomcat GracefulShutdown 구현 본문
Programming/Spring
[SpringBoot] SpringBoot-Tomcat GracefulShutdown 구현
기록하는 백앤드개발자 2022. 6. 26. 16:45반응형
ㅁ SpringBoot 2.3 이전 버젼에서 graceful shutdown 구현
import org.apache.catalina.connector.Connector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
private static final Logger log = LoggerFactory.getLogger(GracefulShutdown.class);
private static final int TIMEOUT = 30;
private volatile Connector connector;
@Override
public void customize(Connector connector) {
this.connector = connector;
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
this.connector.pause(); // 외부의 요청을 더 이상 받지 않도록 한다.
Executor executor = this.connector.getProtocolHandler().getExecutor();
if (executor instanceof ThreadPoolExecutor) {
try {
// 기존 작업들이 정상적으로 종료되었는지 30초 동안 체크하낟.
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
threadPoolExecutor.shutdown();
if (!threadPoolExecutor.awaitTermination(TIMEOUT, TimeUnit.SECONDS)) {
log.warn("Tomcat thread pool did not shut down gracefully within "
+ TIMEOUT + " seconds. Proceeding with forceful shutdown");
threadPoolExecutor.shutdownNow();
if (!threadPoolExecutor.awaitTermination(TIMEOUT, TimeUnit.SECONDS)) {
log.error("Tomcat thread pool did not terminate");
}
}
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
@Bean
public GracefulShutdown gracefulShutdown() {
return new GracefulShutdown();
}
@Bean
public ConfigurableServletWebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(gracefulShutdown);
return factory;
}
참조) https://blog.marcosbarbero.com/graceful-shutdown-spring-boot-apps/
Spring - Tomcat에서의 Graceful Shutdown 관련 레퍼런스는 많았다. 하지만 Spring - Netty로 Graceful Shutdown을 적용한 레퍼런스는 거의 없었다.
반응형
'Programming > Spring' 카테고리의 다른 글
[Spring] REST API - URI 디자인 가이드 (0) | 2022.08.23 |
---|---|
[SpringBoot] SpringBoot에 Graceful Shutdown 적용하기 (2) | 2022.06.27 |
Apache Log4j 보안이슈 대응 (0) | 2021.12.13 |
[Spring] DTO 깔끔하게 정리하는 법, Inner Class (0) | 2021.03.02 |
[Spring] 항상 동일한 데이터를 DB 호출하는 경우 Bean으로 데이터 생성하여 사용하기 (0) | 2021.02.01 |
Comments