什么叫优雅停机
杀死进程之后,阻止新进来的请求,但是进程中正在进行的线程不马上停止。
通用做法
public class GracefulShutdownListener implements TomcatConnectorCustomizer,ApplicationListener<ContextClosedEvent> {
private final Logger logger = LoggerFactory.getLogger(GracefulShutdownListener.class);
private volatile Connector connector;
@Override
public void customize(Connector connector) {
this.connector = connector;
}
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
Executor executor = this.connector.getProtocolHandler().getExecutor();
if (executor instanceof ThreadPoolExecutor) {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
threadPoolExecutor.shutdown();
try {
if (threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS)) {
logger.warn("Tomcat thread pool did not shut down gracefully within 30 seconds.Proceeding with forceful shutdown");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
Spring-Boot高版本(通过配置文件)
优雅停机要求Tomcat的版本必须在 9.0.33及以上, spring-boot 2.3.0.RELEASE 版本内置的Tomcat 是9.0.35 , 所以默认是支持的, 不用我们再考虑
## 开启优雅停机, 如果不配置是默认IMMEDIATE, 立即停机
server.shutdown=graceful
## 优雅停机宽限期时间
spring.lifecycle.timeout-per-shutdown-phase=20s