解决SpringBoot热部署时layering-cache线程池被Tomcat Graceful shutdown,重新赋值方法区中 StatsService的Static ScheduledThreadPoolExecutor,以免初始化Bean时Terminated线程触发拒绝策略

  • SpringBoot热部署
  • Tomcat graceful shutdown(优雅停机)
  • 热部署时
    • 解决
  • layering-cache
  • ScheduledThreadPoolExecutor

SpringBoot热部署

Tomcat graceful shutdown(优雅停机)

1.Tomcat接受请求是通过Connector组件,而这个组件本身实现了LifeCycle接口,它是可以被暂停的,暂停过程只停止接受请求,但不会关闭容器本身
因此,优雅停机,应该是先暂停 Tomcat 的 Connector,然后再等待执行线程执行完成,最后停止。
2.同时layering-cache里StatsService的静态变量ScheduledThreadPoolExecutor也被停掉的
3.热部署 只是将最新的class 装载到另一个classloader,tomcat实际没有重启

热部署时


1.热部署restartedMain线程重新Initializing ExecutorService
2.重新create bean时layering-cache里用的线程池触发拒绝策略,因为此时这里的ScheduledThreadPoolExecutor处于Terminated死亡状态,该状态不能不会切换到其他任何状态。
3.线程池会拒绝任何想要加入的任务。因为这里用的还是同一个running jvm的方法区的静态变量ScheduledThreadPoolExecutor,也是Tomcat优雅停机时 shutdown掉的线程池

解决

思路是在create bean layeringCacheManager初始化前,使用BeanPostProcessor,获取layering-cache框架中BeanFactory的StatsService,通过反射修改静态变量ScheduledThreadPoolExecutor


import com.github.xiaolyuh.stats.StatsService;
import com.github.xiaolyuh.util.NamedThreadFactory;
import com.sun.istack.Nullable;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;
import java.util.concurrent.ScheduledThreadPoolExecutor;/*** @Description 解决SpringBoot热部署时layering-cache线程池被Tomcat Graceful shutdown,*              重新赋值方法区中 StatsService的Static ScheduledThreadPoolExecutor,以免初始化Bean时Terminated线程触发拒绝策略* @Author fuly2* @date 2022-02-18 13:50**/
@Component
public class StatesBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements BeanFactoryAware {@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {}@Override@Nullablepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if ("layeringCacheManager".equals(beanName)) {StatsService statsService = com.github.xiaolyuh.util.BeanFactory.getBean(StatsService.class);Field executor = null;try {executor = statsService.getClass().getDeclaredField("executor");} catch (NoSuchFieldException e) {e.printStackTrace();}executor.setAccessible(true);try {ScheduledThreadPoolExecutor executor2= (ScheduledThreadPoolExecutor) executor.get(statsService);if (executor2.isTerminated()){executor.set(statsService,new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("layering-cache-stat")));}} catch (IllegalAccessException e) {e.printStackTrace();}}return null;}
}

layering-cache

1.layering-cache是一个支持分布式环境的多级缓存框架,使用方式和spring-cache类似。
2.一级缓存使用Caffeine作为本地缓存,二级缓存使用redis作为集中式缓存。一级缓存和二级缓存的数据一致性是通过推和拉两种模式相结合的方式来实现的。推主要是基于redis的pub/sub机制,拉主要是基于消息队列和记录消费消息的偏移量来实现的。

ScheduledThreadPoolExecutor


Terminated是一个线程的最终状态,在该状态中线程不会切换到其他任何状态,线程进入Terminated状态,意味着该线程的整个生命周期都结束了,下列这些情况将会使线程进入Terminated状态。

  • 线程运行正常结束,结束生命周期。
  • 线程运行出错意外结束
  • JVM Crash,导致所有线程都结束。

【多线程】解决SpringBoot热部署时layering-cache线程池被Tomcat Graceful shutdown,重新赋值方法区中 StatsServi相关推荐

  1. 解决SpringBoot热部署配置之IDEA2021版无Compiler.automake.allow.when.app.running问题

    问题描述 解决SpringBoot热部署配置之IDEA2021版无Compiler.automake.allow.when.app.running问题 解决方案: 英语版 汉语版: 给那些看完的朋友, ...

  2. 解决springboot项目部署时视上传视频太大导致的内存溢出问题

    在项目部署时输入命令java -Xms512m -Xmx1024m -jar 项目名.jar

  3. Springboot热部署失效怎么解决?

    刚开始做Springboot的热部署的时候,无论我怎么配置都没有部署成功,最后我发现有些东西,差一点都不行,所以我把热部署整个过程整理了一下,仅供参考!!! 1.首先在pom文件中添加依赖和插件 &l ...

  4. SpringBoot热部署环境搭建和原理分析

    SpringBoot热部署环境搭建 插件会监控 classpath的资源变化 对类加载采用了两种类加载器(只重启开发人员编写的代码部分) 一. 现象 开发项目过程中,修改了某些代码后需要本地验证时,需 ...

  5. springboot热部署该怎么实现?springboot热部署实现方式

    Spring家族博大精深,我之前讲过该如何搭建一个简单的springboot项目,这次我们就来深入探讨一下springboot,比如,你们知道springboot该如何搭建热部署吗?下面就来为大家讲解 ...

  6. 常用注解[spring 的 java 配置] ||springboot 热部署

    常用注解[spring 的 java 配置] 回顾学过的 spring 的注解 @Controller @RestController @Service @Repository @Component ...

  7. springboot热部署工具

    为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需 ...

  8. SpringBoot 热部署

    SpringBoot 热部署 最近在讲springcloud微服务,中间使用到springboot开发代码时,经常因为一点小的改动就需要重启,虽然重启也很快.于是就开始折腾热部署,下面记录如下: 一. ...

  9. SpringBoot热部署加持

    概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件.或者一些诸如xml的配置文件.以及一些静态文件生效,这样耗时又低效.所谓的热部署指的是 ...

  10. idea中配置Springboot热部署

    idea中配置Springboot热部署 1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency>< ...

最新文章

  1. mysql数据库多级分类汇总_sql多级分类汇总实现介绍
  2. git ,报403错误,完美解决方案
  3. python的工资为什么这么低-你拿着3k的工资,不明白为什么别人年薪 200万
  4. SpringCloud(第一部分)
  5. 没有足够的值_孙悟空唯一一次没有搬救兵,玉帝如来却主动出手是什么时候?...
  6. python化学题_中国大学mooc《化学教学论(朱汝葵 陈思静 汤希雁)》考试期末答案高校邦《Python程序设计基础【实境编程】》课后作业答案...
  7. 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
  8. codeforces 650B - Image Preview
  9. 当爬虫遇到需要动态ip才能获取资源的时候如何解决?
  10. Java笔记-Java中桥接模式
  11. Unity Text 插入图片
  12. centos(redhat)用户和组的配置
  13. Excel表格转JPG等多种图片格式(简单粗暴)
  14. Python安装Pandas库
  15. 用扫码枪收款钱到哪里_为何微信设置了密码,超市也能用扫码枪能将钱扫走?真要注意...
  16. 面向猴子编程 GO制作水印
  17. 前端埋点和后端埋点能分开使用吗?【数据埋点介绍】
  18. 09_Pandas从多个条件(AND,OR,NOT)中提取行
  19. 高新技术企业认定四大要素知多少?
  20. html打印预览 分页,有分页功能的WEB打印_js

热门文章

  1. 淮师计算机网络题库,淮阴师范学院(淮师)计算机基础一至六章习题
  2. 幸福课第11讲_笔记
  3. 第五(模块、包说明)
  4. 基于JAVA南京传媒学院门户网计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  5. 贝叶斯网络(belief network)
  6. pca降维算法java_PCA降维算法
  7. 电子邮箱地址是什么?如何找回电子邮箱的地址呢?
  8. 战国李悝的“识人五法
  9. SAP License:SAP反记帐和红字冲销
  10. Windows窗口编程之计算机,WindowsAPI窗口程序设计.docx