`
QING____
  • 浏览: 2254545 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Springboot 2.x优雅关闭tomcat容器

    博客分类:
  • JAVA
 
阅读更多

    1、如果你的springboot应用打包成“可执行jar”,我们通过可以借助springboot launchscript优雅关闭。

    2、如果你的springboot应用是普通jar,通过“java -jar”启动,那么优雅关闭的方式需要外部脚本去控制。

 

    不过无论如何,我们希望做一件事情,就是在应用即将退出之前,关闭tomcat时,让tomcat不再接收新请求、但是已经接收的请求尽可能执行完毕。

 

    为了达成这个设计目标,我们需要自定义tomcat链接器设置,主要思想是:当应用发出ContextClosedEvent时,关闭tomcat的链接处理器(即不再接收新请求),同时等待一段时间直到已有请求处理完毕,然后关闭内部的链接池、线程池。

 

import org.apache.catalina.connector.Connector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.coyote.ProtocolHandler;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
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.TimeUnit;

/**
 * @author liuguanqing
 * created 2019/1/18 12:25 PM
 **/
public class MeteorTomcatConnectorCustomizer implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {

    private volatile Connector connector;

    private static final int WAIT_TIMEOUT = 3000;//6S

    private static final int MAX_WAIT_TIMEOUT = 12000;

    protected static final Log logger = LogFactory.getLog(MeteorTomcatConnectorCustomizer.class);

    @Override
    public void customize(Connector connector) {
        this.connector = connector;
    }

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        if (this.connector == null) {
            logger.warn("Tomcat connector has'nt been ready!");
        }
        ProtocolHandler protocolHandler = this.connector.getProtocolHandler();
        try {
            Executor executor = protocolHandler.getExecutor();
            protocolHandler.stop();//执行关闭流程,此关闭流程中不会关闭外部指定的executer
            //非tomcat内置的executor,建议单独关闭
            if (executor instanceof ThreadPoolExecutor) {
                try {
                    ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
                    int i = 0;
                    while (i < MAX_WAIT_TIMEOUT && !threadPoolExecutor.isShutdown()) {
                        threadPoolExecutor.shutdown();
                        if (!threadPoolExecutor.awaitTermination(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
                            i += WAIT_TIMEOUT;
                            logger.warn("Tomcat thread pool will be shutdown,total waiting-time=[" + i + "ms]");
                        }
                    }
                    if (!threadPoolExecutor.isShutdown()) {
                        threadPoolExecutor.shutdownNow();
                        if (!threadPoolExecutor.awaitTermination(WAIT_TIMEOUT, TimeUnit.MILLISECONDS)) {
                            logger.error("Tomcat thread pool did not terminate,shutdown failed!");
                        }
                    } else {
                        logger.info("Tomcat thread pool has been shutdown successfully!");
                    }
                } catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
            }
        } catch (Exception e) {
            logger.error("Tomcat shutdown error!",e);
        }
    }

}

 

分享到:
评论

相关推荐

    springboot2.X.zip

    **SpringBoot2.X详解** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是用来简化新Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如Redis、MongoDB、JPA、RabbitMQ、Quartz等,只...

    springboot2.x源码

    2. 嵌入式服务器:SpringBoot可以内置Tomcat、Jetty等Web服务器,无需额外部署,简化了开发流程。 3. Starter POMs:Starter是SpringBoot提供的一系列依赖集合,如spring-boot-starter-web、spring-boot-starter-...

    springboot学习.zip

    SpringBoot2.x是Java开发领域中非常流行的一个框架,它简化了基于Spring的应用程序开发,提供了快速构建、启动和运行应用程序的能力。这个压缩包“springboot学习.zip”包含的资源很可能是SpringBoot2.x的学习教程和...

    SpringBoot2.x入门到项目实战

    **SpringBoot2.x入门到项目实战** SpringBoot是由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的初始搭建以及开发过程。SpringBoot通过自动配置、起步依赖和内嵌Servlet容器等方式,使得创建和运行一个...

    springboot1.x版本所创建的demo1.zip

    - **内嵌服务器**:SpringBoot 内置了 Tomcat 或 Jetty 等Servlet容器,使得开发者无需额外配置即可启动一个可运行的Web应用。 - **起步依赖(Starter POMs)**:SpringBoot 提供了一系列的起步依赖,如 spring-...

    服务监控nacos.orcal.springBoot.redis.mysql.tomcat.mq指标及数据结构.xlsx

    prometheus监控nacos.orcal.springBoot.redis.mysql.tomcat.mq的指标和指标翻译

    SpringBoot2.x 视频教程全套

    SpringBoot2.x是Java开发领域中的一个热门框架,由Pivotal团队维护,它简化了基于Spring的应用程序的初始设置和开发过程。本套视频教程全面涵盖了SpringBoot2.x的核心特性,旨在帮助开发者快速上手并掌握这个强大的...

    基于SpringBoot2.x 实现的Java高并发的秒杀系统

    * 后端: SpringBoot-2.x + Redis-4.x * 前端: Bootstrap + Jquery **测试环境** * IDEA + Maven-10.13 + Tomcat8 + JDK8 **启动说明** * 启动前,请配置好 [application.yml]...

    杨开振 springboot2.x

    最新版本,18年8月份资源 为了支持reactive使用场景,内嵌的容器包...举个例子,如果你要使用TomcatEmbeddedServletContainerFactory回调接口来自定义内嵌Tomcat容器,你现在应该使用TomcatServletWebServerFactory。

    使用SpringBoot2.x 简单实现Java高并发之秒杀系统

    后端: SpringBoot-2.x + Redis-4.x 前端: Bootstrap + Jquery 测试环境 IDEA + Maven-10.13 + Tomcat8 + JDK8 启动说明 启动前,请配置好 application.yml 中连接数据库的用户名和密码,以及Redis服务器的地址...

    springboot单独升级Tomcat

    2. 替换成需要的版本:根据找到的当前各个模块的 Tomcat 配置,替换成需要的版本后,将配置内容添加到启动类所在的 pom.xml 中配置中即可。 3. 无启动项的模块无需修改:如果 common 模块中没有启动项,无需修改 ...

    tomcat-jdbc数据源所需jar包tomcat-jdbc.jar+tomcat-juli.jar

    在Java Web应用中,Tomcat是一个广泛使用的开源应用服务器,它提供了Servlet容器和JSP引擎等核心功能。在处理数据库连接方面,Tomcat提供了一种高效且可管理的数据源实现,名为“tomcat-jdbc数据源”。这个数据源是...

    Java开发案例-springboot-55-undertow替换默认tomcat容器-源代码+文档.rar

    Java开发案例-springboot-55-undertow替换默认tomcat容器-源代码+文档.rar Java开发案例-springboot-55-undertow替换默认tomcat容器-源代码+文档.rar Java开发案例-springboot-55-undertow替换默认tomcat容器-源代码...

    springboot描述.doc

    1. **独立运行**:SpringBoot内置了Servlet容器,如Tomcat或Jetty,因此我们不再需要将应用打包成war文件部署到外部服务器,只需运行包含所有依赖的jar文件即可。 2. **简化配置**:通过`spring-boot-starter`系列...

    tomcat部署springboot+vue.doc

    在本教程中,我们将深入探讨如何在Tomcat服务器上部署一个结合了SpringBoot后端和Vue.js前端的应用。 首先,为了在Tomcat上部署SpringBoot+Vue项目,我们需要进行以下步骤: 1. **修改POM文件**: 在SpringBoot...

    SpringBoot基础.pdf

    - SpringBoot使用main方法启动,不需要外置的Servlet容器如Tomcat。 - 内嵌的Servlet容器简化了应用的部署。 三、Web配置 1. SpringBoot的自动配置 - SpringBoot提供了大量默认配置,按照约定优于配置的原则...

    springboot-demo:基于SpringBoot 2.x整合各种常用开发工具,包括但不限于Redis,MyBatisPlus,RocketMQ,RabbitMQ,Elasticsearch,Quartz,Xxl-Job,Kafka等

    项目简介基于SpringBoot 2.x整合各种常用开发工具,包括但不限于Redis,MyBatisPlus,RocketMQ,RabbitMQ,Elasticsearch,Quartz,Xxl-Job,Kafka等。参考教程序号文章标题000102030405060708091011121314...

    狂神说springboot笔记.zip

    3. **嵌入式服务器**:SpringBoot可以内嵌Tomcat或Jetty等Servlet容器,这样就不需要额外安装和配置服务器,极大地提高了开发效率。 4. **Actuator**:SpringBoot Actuator提供了健康检查、监控、指标收集等功能,...

    SpringBoot报错.docx

    通常,SpringBoot官方文档会明确指出每个版本对应的Tomcat版本,你可以根据你正在使用的SpringBoot版本去查阅官方文档,确保选用的Tomcat版本是最适合的。 除了依赖问题,还有其他可能引起SpringBoot应用报错的原因...

    springboot入门示例可运行在tomcat6容器

    **SpringBoot入门示例在Tomcat6容器中的运行详解** SpringBoot是由Pivotal团队提供的全新框架,旨在简化Spring应用程序的初始搭建以及开发过程。它集成了大量的常用第三方库配置,如Redis、MongoDB、JPA、RabbitMQ...

Global site tag (gtag.js) - Google Analytics