当前位置: 首页 > news >正文

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 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章&#xff1…...

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的线程间通信分为这几大类 由于我还在学习中&#xff0c;目前显从信号开始记录学习 二、逐块讲解 1、信号&#xff08;osSignalWait osSignalSet&#xff09; FreeRTOS从V8.2.0版本开始提供任务通知这个功能&#xff0c;每个任务多有一个32位的通知值&am…...

Linux内存管理工作原理:

Linux使用虚拟内存和内存映射来管理内存。每个进程都有独立的虚拟地址空间&#xff0c;通过将虚拟地址映射到物理内存&#xff0c;实现对内存的管理和访问。 虚拟地址空间划分&#xff1a;32位系统中&#xff0c;内核空间占1GB&#xff0c;用户空间占3GB&#xff1b;64位系统中…...

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架

并发&#xff0c;数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下&#xff1a; 基于事件异步并发框架com.lmax.disruptor 下载下示例代码&#xff0c;跑起来发现&#xff0c;在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-…...

二维数组的鞍点

描述 给定一个二维数组&#xff0c;找出其中的鞍点。若存在鞍点&#xff0c;则输出其位置&#xff1b;否则输出“NO”。 鞍点的定义&#xff1a;在一个矩阵的行和列中&#xff0c;某个元素是所在行的最大值&#xff0c;而同列中又是最小值。 输入 输入包含多行&#xff0c;…...

go 内置函数copy()

go内置函数copy go 内置函数copy()函数说明&#xff1a;代码例子1&#xff1a;代码例子2&#xff1a;代码例子3&#xff1a; go 内置函数copy() 函数说明&#xff1a; 当我们在Go语言中需要将一个切片的内容复制到另一个切片时&#xff0c;可以使用内置的copy()函数。copy()函…...

Spring简述

Sping是什么Spring主要模块IOCDI依赖注入的三种方式 AOP术语 Sping是什么 Spring是一个轻量级的开源框架&#xff0c;主要作用是为了简化开发&#xff0c;它以IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为内核 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 总结&#xff1a; 1 杂而不经 2 摆烂劝退居多 3 适合躺平 4 考公不行 5 要多…...

Android中的Apk 包体优化

Android中的Apk 包体优化 在Android中&#xff0c;APK包体优化指的是减小应用程序的安装包大小&#xff0c;以降低用户下载和安装应用的成本&#xff0c;提高用户体验。APK包体优化对于应用的性能、启动速度和用户留存率都有着重要的影响。下面展开说说一些常见的APK包体优化策…...

Java基础接口详解

Java基础接口详解 ​ 文末附上下载详解pdf链接 ​ 实现java代码中接口详细分析 Java基础接口是一种定义了一组方法签名但没有提供实际实现的抽象类似的结构。它们允许类通过实现接口来声明自己拥有某些特定的行为。接口在Java中扮演了重要的角色&#xff0c;以下是一些关键点…...

CCL 2023 电信网络诈骗案件分类评测-第一名方案

1 任务内容 1.1 任务背景 2022年12月1日起&#xff0c;新出台的《反电信网络诈骗犯罪法》正式施行&#xff0c;表明了我国治理当前电信网络诈骗乱象的决心。诈骗案件分类问题是打击电信网路诈骗犯罪过程中的关键一环&#xff0c;根据不同的诈骗方式、手法等将其分类&#xff…...

go test

关于go test 报错 command-line-arguments go test 直接调用被测试go文件方法时候报错 command-line-arguments [command-line-arguments.test]&#xff0c;这里已经明确指出了命令参数问题 PS E:\code\mqtt> go test .\client_test.go # command-line-arguments [comma…...

401 · 排序矩阵中的从小到大第k个数

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param matrix: a matrix of intege…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...