目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、SpringCloud 扩展
SpringCloud提供了一种扩展,用于在应用结束运行之前,执行该接口的所有实现
必须实现接口:TomcatConnectorCustomizer
使用方法如下:
@Bean
public GracefulShutdown gracefulShutdown() {
return new GracefulShutdown();
}
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
log.info("开始调用 TomcatServletWebServerFactory,添加自定义的优雅关机方法 ");
tomcat.addConnectorCustomizers(gracefulShutdown());
return tomcat;
}
private class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
private volatile Connector connector;
private final int waitTime = 30;
@Override
public void customize(Connector connector) {
this.connector = connector;
}
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
log.info("优雅关机进行中, 连接停止,并关闭连接池。" + new Date());
this.connector.pause();
Executor executor = this.connector.getProtocolHandler().getExecutor();
if (executor instanceof ThreadPoolExecutor) {
try {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
threadPoolExecutor.shutdown();
if (!threadPoolExecutor.awaitTermination(waitTime, TimeUnit.SECONDS)) {
log.warn("Tomcat thread pool did not shut down gracefully within " + waitTime + " seconds. Proceeding with forceful shutdown");
}
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
log.info("已经完成关机。" + new Date());
}
}
二、TomcatConnectorCustomizer介绍
TomcatConnectorCustomizer接口是Spring Boot中的一个接口,主要用于定制Tomcat连接器的行为
通过实现TomcatConnectorCustomizer接口并重写其customize方法来修改Tomcat连接器的配置。例如,你可以设置最大线程数、最小空闲线程数等参数。
三、ContextClosedEvent介绍
ContextClosedEvent是Spring Framework中的一个事件类,用于表示Web应用程序上下文关闭的事件。当Web应用程序上下文关闭时,会触发该事件。
该事件通常与Spring的ApplicationListener接口一起使用,以便在Web应用程序上下文关闭时执行特定的操作。例如,你可以在Web应用程序关闭时清理资源、释放连接池等。
ContextClosedEvent是一个非常重要的事件类,可以帮助你在Web应用程序上下文关闭时执行必要的清理工作。
四、优雅关机原理
1.注册事件、监听事件
2.应用关闭,触发程序上下文关闭,触发关闭事件
3.执行事件方法实现逻辑,调用线程池关闭方法,不再接收新的任务,待进行中的任务执行完,关闭线程池,关闭上下文,关闭连接