zoukankan      html  css  js  c++  java
  • 服务器spring boot版本,平滑升级

    1、在pom文件中加入:

    <!--平滑升级包 开始 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--平滑升级包 结束 -->

    2、在spring配置文件中:

    #平滑关闭配置开始
    management.endpoint.shutdown.enabled=true
    management.endpoints.web.exposure.include=*
    #平滑关闭配置结束

    3、定制controller

    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.annotation.Configuration;
    import org.springframework.context.event.ContextClosedEvent;

    import java.util.concurrent.Executor;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;

    /**
    * 定制的 Connector(tomcat处理器)
    *
    */
    @Configuration
    public class CustomShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    private static final int TIMEOUT = 30;

    private volatile Connector connector;

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
    this.connector.pause();
    Executor executor = this.connector.getProtocolHandler().getExecutor();
    if (executor instanceof ThreadPoolExecutor) {
    try {
    logger.warn("WEB 应用准备关闭");
    ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
    threadPoolExecutor.shutdown();
    if (!threadPoolExecutor.awaitTermination(TIMEOUT, TimeUnit.SECONDS)) {
    logger.warn("WEB 应用等待关闭超过最大时长 " + TIMEOUT + " 秒,将进行强制关闭!");
    threadPoolExecutor.shutdownNow();
    if (!threadPoolExecutor.awaitTermination(TIMEOUT, TimeUnit.SECONDS)) {
    logger.error("WEB 应用关闭失败!");
    }
    }
    } catch (InterruptedException ex) {
    Thread.currentThread().interrupt();
    }
    }
    }

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

    4、在spring启动类中加入

    @Bean
    public CustomShutdown customShutdown() {
    return new CustomShutdown();
    }

    /**
    * 将定制的添加到tomcat
    * @param customShutdown
    * @return
    */
    @Bean
    public ConfigurableServletWebServerFactory webServerFactory(CustomShutdown customShutdown) {
    TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();
    tomcatServletWebServerFactory.addConnectorCustomizers(customShutdown);
    return tomcatServletWebServerFactory;
    }

    完成

  • 相关阅读:
    vue2.0对于数组变化不及时刷新视图的问题
    [Node]报错:gyp verb check python checking for Python executable "python2" in the PATH
    spring的@ControllerAdvice注解
    antdVue--Upload使用
    antd Vue--this.$confirm弹窗使用
    播放视频判断是否暂停_Javascript判断Video视频播放、暂停、结束完成及获取长度事件监听处理...
    P5400 [CTS2019]随机立方体
    P7502 「HMOI R1」不知道是啥的垃圾题
    vue3插槽使用
    cocos creator破解
  • 原文地址:https://www.cnblogs.com/xwjBlog/p/11556121.html
Copyright © 2011-2022 走看看