Spring @Scheduled单线程单实例的坑
文章目录
- 前言
- 背景
- 验证
- 解决方案
前言
在 Java Spring 项目中经常会用 @Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。
其他相关文章:Spring @Scheduled 多线程配置
背景
在 Spring Web 项目中,使用了多个 @Scheduled 来做任务的定时跑批,发现与预期的效果不一致
比如三个 @Scheduled 定时任务,在三个不同的类里面
- 任务1(class1):每10秒钟执行一次
- 任务2(class2):每10秒钟执行一次
- 任务3(class3):每10秒钟执行一次
预期效果:
三个任务是三个独立的定时任务线程池在控制,每10秒钟执行一次,任务之间互不影响
实际效果:
项目启动之后,发现这三个任务是串行执行,第一个任务未执行完的情况下,其他两个任务也会等待。
验证
启动项目之后,分别在三个任务上打上断点
spring @Scheduled 注解的处理类源码:
- org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor
- org.springframework.scheduling.config.ScheduledTaskRegistrar#scheduleTasks 初始化方法
在项目启动过程中只进来了一次,taskScheduler 实例化赋值一次,而且是单线程的线程池 SingleThreadScheduledExecutor
this.localExecutor = Executors.newSingleThreadScheduledExecutor();

观察 thread 名称,分别在每个 @Scheduled 方法中都打断点
第一个 FaceTask#start() 方法,threadName = pool-8-thread-1

第二个 ProfileTask#start() 方法,threadName = pool-8-thread-1

第三个 TmpFaceTask#faceDelayPush() 方法,threadName = pool-8-thread-1

通过源码+代码调试可以得到结论,在同一个 Spring 容器中(项目中),使用多个 @Scheduled 定时任务,每个标记有 @Scheduled 任务之间是串行执行的,使用的是同一个线程池,此线程池默认通过 Executors.newSingleThreadScheduledExecutor() 创建的单线程(核心线程=最大线程)的线程池。
解决方案
如何达到不同定时任务之间互不影响,都采用独立的定时任务线程池来执行呢?
由于 @Scheduled 的实现提供的扩展点比较单一,我们只能采用 API 编程的方式来完成了。
- 每个类中来创建定时任务线程池
- 调用需要执行的业务逻辑
@Component
@Slf4j
class ATask{// 创建线程池private ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();@PostConstructpublic void init(){scheduledExecutor.schedule(this::start, 10000, TimeUnit.MILLISECONDS);}public void start() {... // 原处理逻辑}
}
相关文章:
Spring @Scheduled单线程单实例的坑
文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章࿱…...
7-数据结构-(带头节点)单链表的增删改查
问题: 单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。带头节点是为…...
每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)
今日份题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...
玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包
目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...
配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”
配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...
【枚举】CF1706 C
有人一道1400写了一个小时 Problem - C - Codeforces 题意: 思路: 首先先去观察样例: 很显然,对于n是奇数的情况,只有一种情况,直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...
uniapp-疫情应急管理系统学生端
1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…...
FreeRTOS的线程间通信
一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中,目前显从信号开始记录学习 二、逐块讲解 1、信号(osSignalWait osSignalSet) FreeRTOS从V8.2.0版本开始提供任务通知这个功能,每个任务多有一个32位的通知值&am…...
Linux内存管理工作原理:
Linux使用虚拟内存和内存映射来管理内存。每个进程都有独立的虚拟地址空间,通过将虚拟地址映射到物理内存,实现对内存的管理和访问。 虚拟地址空间划分:32位系统中,内核空间占1GB,用户空间占3GB;64位系统中…...
【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架
并发,数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下: 基于事件异步并发框架com.lmax.disruptor 下载下示例代码,跑起来发现,在shenyuAdmin模块里面用到了com.lma…...
Nginx(2)
目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…...
二维数组的鞍点
描述 给定一个二维数组,找出其中的鞍点。若存在鞍点,则输出其位置;否则输出“NO”。 鞍点的定义:在一个矩阵的行和列中,某个元素是所在行的最大值,而同列中又是最小值。 输入 输入包含多行,…...
go 内置函数copy()
go内置函数copy go 内置函数copy()函数说明:代码例子1:代码例子2:代码例子3: go 内置函数copy() 函数说明: 当我们在Go语言中需要将一个切片的内容复制到另一个切片时,可以使用内置的copy()函数。copy()函…...
Spring简述
Sping是什么Spring主要模块IOCDI依赖注入的三种方式 AOP术语 Sping是什么 Spring是一个轻量级的开源框架,主要作用是为了简化开发,它以IOC(控制反转)和AOP(面向切面编程)为内核 Spring主要模块 我们一般…...
框框大学之——教育技术学
清一色劝退的教育技术学。。。。。。 https://www.kkdaxue.com/?current1&major%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF%E5%AD%A6&pageSize10&sortFieldcreateTime&sortOrderdescend 总结: 1 杂而不经 2 摆烂劝退居多 3 适合躺平 4 考公不行 5 要多…...
Android中的Apk 包体优化
Android中的Apk 包体优化 在Android中,APK包体优化指的是减小应用程序的安装包大小,以降低用户下载和安装应用的成本,提高用户体验。APK包体优化对于应用的性能、启动速度和用户留存率都有着重要的影响。下面展开说说一些常见的APK包体优化策…...
Java基础接口详解
Java基础接口详解 文末附上下载详解pdf链接 实现java代码中接口详细分析 Java基础接口是一种定义了一组方法签名但没有提供实际实现的抽象类似的结构。它们允许类通过实现接口来声明自己拥有某些特定的行为。接口在Java中扮演了重要的角色,以下是一些关键点…...
CCL 2023 电信网络诈骗案件分类评测-第一名方案
1 任务内容 1.1 任务背景 2022年12月1日起,新出台的《反电信网络诈骗犯罪法》正式施行,表明了我国治理当前电信网络诈骗乱象的决心。诈骗案件分类问题是打击电信网路诈骗犯罪过程中的关键一环,根据不同的诈骗方式、手法等将其分类ÿ…...
go test
关于go test 报错 command-line-arguments go test 直接调用被测试go文件方法时候报错 command-line-arguments [command-line-arguments.test],这里已经明确指出了命令参数问题 PS E:\code\mqtt> go test .\client_test.go # command-line-arguments [comma…...
401 · 排序矩阵中的从小到大第k个数
链接:LintCode 炼码 - ChatGPT!更高效的学习体验! 题解: 九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param matrix: a matrix of intege…...
STM8 Bootloader开发与固件远程升级实践
1. Bootloader的核心价值与应用场景在嵌入式产品开发中,Bootloader的重要性经常被低估。直到去年参与某工业控制器项目时,我才真正体会到它的价值——当时现场有200台设备需要紧急修复通信协议漏洞,但设备外壳采用防水密封设计,拆…...
seo网站诊断的步骤是什么
SEO网站诊断的步骤是什么? 在当今数字化时代,网站的SEO优化(搜索引擎优化)是提升网站流量和品牌知名度的关键。进行SEO网站诊断是一个系统性的过程,通过这一过程,可以发现并解决网站在搜索引擎上的表现问题…...
Vivado中FFT9.1 IP核的AXI4-Stream接口深度解析
1. AXI4-Stream接口基础与FFT9.1 IP核概览 在FPGA信号处理领域,FFT(快速傅里叶变换)是实现频域分析的核心算法。Xilinx Vivado提供的FFT9.1 IP核通过AXI4-Stream接口大幅简化了数据交互流程。这个接口就像高速公路上的智能物流系统ÿ…...
终极指南:如何使用HunterPie游戏界面增强工具提升《怪物猎人:世界》体验
终极指南:如何使用HunterPie游戏界面增强工具提升《怪物猎人:世界》体验 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.co…...
北京交通大学校内邮箱配置指南:Windows与Mac系统自带邮件应用全攻略
1. 为什么需要配置校内邮箱? 作为北京交通大学的师生,校内邮箱是重要的通讯工具。无论是接收学校通知、提交作业,还是与导师同学沟通,都需要用到这个官方邮箱。很多同学第一次使用时,可能会被各种服务器设置搞得一头雾…...
技术方案:deepseek对话怎么导出PDF
在日常使用 DeepSeek 的过程中,一个让人又爱又恨的问题反复出现:回答质量很高,但想把它存下来却非常麻烦。 无论是做技术调研、写方案、做知识沉淀,还是整理学习笔记,DeepSeek 给出的答案往往信息密度大、结构清晰&am…...
Xamarin.Macios实战教程:10个技巧提升你的开发效率
Xamarin.Macios实战教程:10个技巧提升你的开发效率 【免费下载链接】xamarin-macios .NET for iOS, Mac Catalyst, macOS, and tvOS provide open-source bindings of the Apple SDKs for use with .NET managed languages such as C# 项目地址: https://gitcode.…...
notepad--性能优化完全指南:从基础调优到源码级优化
notepad--性能优化完全指南:从基础调优到源码级优化 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- notepa…...
电力设施智能检测:TTPLA数据集赋能电网巡检自动化全流程指南
电力设施智能检测:TTPLA数据集赋能电网巡检自动化全流程指南 【免费下载链接】ttpla_dataset aerial images dataset on transmission towers and power lines 项目地址: https://gitcode.com/gh_mirrors/tt/ttpla_dataset 在电力行业数字化转型进程中&…...
告别繁琐计算:开源计算工具Calcpad如何重塑工程数学工作流
告别繁琐计算:开源计算工具Calcpad如何重塑工程数学工作流 【免费下载链接】Calcpad Free and open source software for mathematical and engineering calculations. 项目地址: https://gitcode.com/gh_mirrors/ca/Calcpad 你是否曾经为工程计算中重复的公…...
