• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Springboot项目平滑关闭及自动化关闭脚本

springboot 搞代码 4年前 (2022-01-09) 47次浏览 已收录 0个评论

Springboot项目平滑关闭及自动化关闭脚本

核心代码

  • GracefulShutdown.java
  • Shutdown.java
  • ApplicationStarterRunner.java
  • CommonInfo.java
  • HttpCommonUtil.java
  • application.properties

操作步骤

核心代码

GracefulShutdown.java

package cnkj.site.utils;

import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.util.LifecycleBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.ContextClosedEvent;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/*
 * @version 1.0 created by Carol on 2019/4/25 16:22
 */
public class Gracefu<span>本文来源gaodai#ma#com搞*!代#%^码网5</span>lShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
 private static final Logger LOGGER = LoggerFactory.getLogger(GracefulShutdown.class);

 private volatile Connector connector;

 @Override
 public void customize(Connector connector) {
  this.connector = connector;
 }
 @Override
 public void onApplicationEvent(ContextClosedEvent event) {
  try {
   // 指定执行的方法
   shutdown();
   //手动清理内存
   System.gc();
   LOGGER.warn("清理内存完毕,正在退出服务......");
   if (this.connector == null){
    return;
   }
   this.connector.pause();
   LOGGER.warn("关闭全部连接......");
   Executor executor = this.connector.getProtocolHandler().getExecutor();
   if (executor instanceof ThreadPoolExecutor) {
    try {
     ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
     threadPoolExecutor.shutdown();
     LOGGER.warn("当前服务线程池被关闭");
     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 ex) {
     Thread.currentThread().interrupt();
    }
   }
   this.connector.stop();
  } catch (LifecycleException e) {
   e.printStackTrace();
  }
 }

 @Bean
 public GracefulShutdown gracefulShutdown() {
  return new GracefulShutdown();
 }
 @Bean
 public ConfigurableServletWebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
  TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
  factory.addConnectorCustomizers(gracefulShutdown);
  return factory;
 }


 /**
  * 执行服务关闭前的一些定制化操作
  * 通常需要确认以下步骤
  * 1.关闭kafka等数据连接
  * 2.flush内存中全部的未处理数据
  * 3.清理服务中全部待处理的数据
  */
 public void shutdown(){}
}

Shutdown.java

import cnkj.site.utils.GracefulShutdown;
import org.springframework.stereotype.Component;

/*
 * @version 1.0 created by Carol on 2019/4/25 16:39
 */
@Component
public class Shutdown extends GracefulShutdown {

 @Override
 public void shutdown() {
  // TODO 定制化关闭操作流程
  // 关闭 kafka 消费
  // flush全部读写流
  // 清空队列
  // 关闭全部文件流读写
 }
}

ApplicationStarterRunner.java

package cn.migu.log.component;

import cnkj.site.utils.HttpCommonUtil;
import cnkj.site.CommonInfo;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/*
 * @version 1.0 created by LXW on 2019/3/14 17:05
 */
@Component
public class ApplicationStarterRunner implements CommandLineRunner {

 @Override
 public void run(String... args) throws Exception {
  // 设置服务名
  commonInfo.setSERVICE_NAME("Service-Name");
  // 自动设置服务启动后的进程号
  commonInfo.setSERVICE_PID(HttpCommonUtil.getCurrentPid());
 }
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Springboot项目平滑关闭及自动化关闭脚本
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址