Spring Boot多线程环境下,解决多个定时任务冲突问题

2023-11-04

问题引入

关于定时任务注解@Scheduled在之前的文章已经讲到,Spring Boot定时器默认的是单线程的。

但是问题就来了,如果在线程争夺资源后,某个线程需要比较长时间才能执行完,那其他的定时器怎么办,都只能进入等待状态,时间越久,累计等待的定时器越多,这就容易引起雪崩…

场景重现

我们清晰的看到执行结果都是scheduling-1。

如果在线程争夺资源后,某个线程需要比较长时间才能执行完,那其他的定时器怎么办,都只能进入等待状态,时间越久,累计等待的定时器越多,这就容易引起雪崩…

其实只需要添加一个配置类然后加注解就可以解决问题了

解决方案

添加注解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKjiIaeG-1641914203401)(https://www.cuizb.top/myblog/static/image/b8f6f4e6b6a5bda8c3b0477827d8007f.jpeg)]

具体代码如下 :

import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class SchedulerTaskController {
    private Logger logger= LoggerFactory.getLogger(SchedulerTaskController.class);
    private static final SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
    private int count=0;
    @Scheduled(cron="*/6 * * * * ?")
    @Async("threadPoolTaskExecutor")
    public void process(){
        logger.info("英文:this is scheduler task runing "+(count++));
    }

    @Scheduled(fixedRate = 6000)
    @Async("threadPoolTaskExecutor")
    public void currentTime(){
        logger.info("中文:现在时间"+dateFormat.format(new Date()));
    }
}

配置类如下 :

具体代码如下 :

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;

/**使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要来创建Executors,
 * 在使用spring中,已经给我们做了很好的支持。只要要@EnableAsync就可以使用多线程
 * 通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池。*/
//@Configuration 表示该类是一个配置类
@Configuration
@EnableAsync
//所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。
public class TaskScheduleConfig {
    private static final int corePoolSize = 10;         // 默认线程数
    private static final int maxPoolSize = 100;       // 最大线程数
    private static final int keepAliveTime = 10;   // 允许线程空闲时间(单位:默认为秒),十秒后就把线程关闭
    private static final int queueCapacity = 200;   // 缓冲队列数
    private static final String threadNamePrefix = "it-is-threaddemo-"; // 线程池名前缀

    @Bean("threadPoolTaskExecutor") // bean的名称,默认为首字母小写的方法名
    public ThreadPoolTaskExecutor getDemoThread(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(keepAliveTime);
        executor.setKeepAliveSeconds(queueCapacity);
        executor.setThreadNamePrefix(threadNamePrefix);

        //线程池拒绝任务的处理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //初始化
        executor.initialize();

        return executor;
    }
}

然后我们可以很清晰地看到

如上,也就解决了用多线程解决Springboot多定时器冲突的问题

更多文章和干货请移驾公众号和个人网站

本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1641914179
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot多线程环境下,解决多个定时任务冲突问题 的相关文章

  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • Java String.format 向整数添加空格

    我有一小段代码 我不明白输出 此输出向我的字符串格式文本添加空格 我做错了什么吗 public class HelloWorld public static void main String args int a1 540 int a2 4
  • 如何将 mongoTemplate 自动装配到自定义类型转换器中?

    我正在尝试创建一个转换器 它将通过对象 ID 从数据库中获取对象 但转换器中的 mongoTemplate 始终为空 org springframework core convert ConversionFailedException 失败
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储

随机推荐

  • 后继者:找出二叉搜索树中指定节点的“下一个”节点

    后继者 设计一个算法 找出二叉搜索树中指定节点的 下一个 节点 也即中序后继 如果指定节点没有对应的 下一个 节点 则返回null 来源 力扣 LeetCode 链接 https leetcode cn problems successor
  • nextTick 原理及作用

    Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用 nextTick 的核心是利用了如 Promise MutationObserver setImmediate setTimeout的
  • Leetcode刷题-最长公共前缀

    Leetcode刷题 最长公共前缀 简介 题目 个人答案及结果 学习一下官方的 简介 最近尝试下大家口口相传的神器 leetcode cn com 大家自己注册就可以选择题库进行使用了 我都会先自己出一个答案 然后再学习别人的标准答案 进行
  • element修改el-table 表头的背景颜色横向渐变色 + 修改表头背景颜色

    vue element ui 修改el table 表头的背景颜色横向渐变色 修改表头背景颜色 表头背景颜色横向渐变效果图 修改表头背景颜色和字体颜色效果图 直接上代码 修改表头的背景颜色横向渐变色的代码 html
  • SSH一段时间未使用自动断开的解决办法

    有两种解决方案 可以修改服务器端的参数 也可以修改本地链接的参数 为了安全起见 我这里选择了修改我本地的配置 在路径 etc ssh ssh config下添加如下配置 ServerAliveInterval 60 ServerAliveC
  • HTML的Input(type)的属性都有哪些

    作者介绍 一个有梦想 有理想 有目标的 且渴望能够学有所成的追梦人 学习格言 不读书的人 思想就会停止 狄德罗 个人主页 进入博主主页 欢迎小伙伴们访问到博主的文章内容 在浏览阅读过程发现需要纠正的地方 烦请指出 愿能与诸君一同成长 目录
  • [ZZ]计算机视觉、机器学习相关领域论文和源代码大集合

    注 下面有project网站的大部分都有paper和相应的code Code一般是C C 或者Matlab代码 最近一次更新 2013 1 29 一 特征提取Feature Extraction SIFT 1 Demo program SI
  • [python logging]日志记录模块

    logging 介绍 Logger从来不直接实例化 经常通过logging模块级方法 Module Level Function logging getLogger name 来获得 其中如果name不给定就用root 名字是以点号分割的命
  • 解决iframe的frameborder在chrome/ff/ie下的差异

    最近的项目中使用了动态创建iframe的js方法 发现iframe frameborder 0 在IE7下不管用 而chrome ff都正常的 很是郁闷 var iframe document createElement iframe if
  • Docker Compose安装教程

    Docker Compose安装 准备二进制文件 并移动到指定目录 在线安装 直接执行下面命令下载 sudo curl L https github com docker compose releases download v2 6 1 d
  • windows安装mpi4py

    为了能够在windows 本次测试为win7 上使用MPI 试了很多种办法 现在将本人可行的办法在这里发出来 供大家参考 下载安装MS MPI 下载链接 MS MPI Release Notes 选择自己心仪的版本下载 包含两个文件 msm
  • 期货的本质(期货的本质是什么)

    期货的本质是什么 本质是一个风险转移工具 通过把风险转移给愿意投机获利 亏损的人 产业方得以获得确定的盈利预期 这是期货的核心价值 狭义理论认为期货市场是 零和 负和 游戏 但如果把眼光放宽 把实体产业加进来 可以发现期货是市场环境里一项必
  • Flink高手之路4-Flink流批一体

    文章目录 Flink高手之路4 Flink流批一体API开发 一 流批一体相关的概念 1 数据的时效性 2 流处理和批处理 1 批处理 2 流处理 3 两者对比 3 流批一体API 4 流批一体的编程模型 二 Data Source 1 预
  • enum(枚举)

    C enum 枚举 枚举是 C 语言中的一种基本数据类型 它可以让数据更简洁 更易读 枚举语法定义格式为 enum 枚举名 枚举元素1 枚举元素2 接下来我们举个例子 比如 一星期有 7 天 如果不用枚举 我们需要使用 define 来为每
  • IOS安全测试(资源学习笔记)

    客户端程序安全 位置无关代码 检测客户端是有启用Position Independent Executable PIE 编译选项 采用PIE选项编译的引用程序允许使用地址空间随机分布功能 ASLR Address Space Layout
  • PHPExcel导入导出操作总结

    PHPExcel 是用来操作Office Excel 文档的一个PHP类库 它基于微软的OpenXML标准和PHP语言 可以使用它来读取 写入不同格式的电子表格 如 Excel BIFF xls Excel 2007 OfficeOpenX
  • CocosCreator中TiledMap简单使用

    在开发游戏过程中 有时候会用到TiledMap 瓦片地图 我这边使用的是1 4 3版本的tiledmap 2 3 4版本的CocosCreator 其他版本的tiledmap会有做不了动画的问题 后面会说到 视频参考 B站UP主 阿信OL
  • 【UnityShader】模板Stencil测试

    效果 原理 使用后处理 在后处理阶段先渲染产生一张RenderTexture 包含要被描边的物体 使用描边色渲染 高斯模糊RenderTexture 会产生边缘 用高斯模糊的图片反向剔除未模糊的图 这样只保留模糊多出的部分 此时Render
  • Prim算法 与 Kruskal算法 求最小生成树

    一 Prim算法 普利姆 Prim 算法适用于求解无向图中的最小生成树 Minimum Cost Spanning Tree 下面是Prim算法构造最小生成树的过程图解 选择一个节点开始 比如V1进入集合U 剩下的集合的
  • Spring Boot多线程环境下,解决多个定时任务冲突问题

    问题引入 关于定时任务注解 Scheduled在之前的文章已经讲到 Spring Boot定时器默认的是单线程的 但是问题就来了 如果在线程争夺资源后 某个线程需要比较长时间才能执行完 那其他的定时器怎么办 都只能进入等待状态 时间越久 累