Spring定时任务修仙指南:从@Scheduled到分布式调度的终极奥义
各位被Thread.sleep()
和while(true)
折磨的Spring道友们!今天要解锁的是Spring生态自带的定时任务三件套——@Scheduled
、TaskScheduler
、@Async
定时组合技!无需引入外部依赖,轻松实现从简单定时到分布式调度的全场景覆盖!准备好抛弃Quartz的复杂配置了吗? ⏰
一、筑基篇:@Scheduled基础用法
1.1 开启定时任务(激活灵脉)
@SpringBootApplication
@EnableScheduling // 关键注解!放在启动类上
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}
1.2 定时方法配置(三套仙术)
@Component
public class MyTask {// 1. 固定速率(上次开始后间隔固定时间)@Scheduled(fixedRate = 5000) // 每5秒执行public void task1() {System.out.println("固定速率任务:" + LocalDateTime.now());}// 2. 固定延迟(上次结束后间隔固定时间)@Scheduled(fixedDelay = 3000) // 每次执行完等3秒public void task2() throws InterruptedException {Thread.sleep(1000); // 模拟耗时System.out.println("固定延迟任务:" + LocalDateTime.now());}// 3. Cron表达式(天庭历法)@Scheduled(cron = "0 0/5 9-18 * * MON-FRI") // 工作日9-18点每5分钟public void task3() {System.out.println("Cron任务:" + LocalDateTime.now());}
}
二、金丹篇:高级配置技巧
2.1 动态修改定时规则(天机可变)
@RestController
public class TaskController {@Autowiredprivate ScheduledTaskRegistrar taskRegistrar;@PostMapping("/update-task")public String updateTask(@RequestParam String newCron) {// 取消原有任务taskRegistrar.destroy();// 添加新任务taskRegistrar.addCronTask(() -> System.out.println("动态任务执行: " + LocalDateTime.now()),newCron);taskRegistrar.afterPropertiesSet();return "任务已更新为: " + newCron;}
}
2.2 异步定时任务(分身术)
@Configuration
@EnableAsync // 开启异步支持
public class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.initialize();return executor;}
}@Component
public class AsyncTask {@Async@Scheduled(fixedRate = 3000)public void asyncTask() {System.out.println("异步任务线程:" + Thread.currentThread().getName());}
}
三、元婴篇:分布式定时任务
3.1 基于Redis的分布式锁(防重复执行)
@Component
public class DistributedTask {@Autowiredprivate RedissonClient redisson;@Scheduled(cron = "0 0/5 * * * ?")public void distributedJob() {RLock lock = redisson.getLock("scheduled:lock");try {if (lock.tryLock(0, 30, TimeUnit.SECONDS)) {System.out.println("获取锁成功,执行任务...");// 业务代码...}} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}}
}
3.2 结合ShedLock实现(推荐)
<!-- 添加依赖 -->
<dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.42.0</version>
</dependency>
<dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-jdbc-template</artifactId><version>4.42.0</version>
</dependency>
@Configuration
@EnableSchedulerLock(defaultLockAtMostFor = "10m")
public class ShedLockConfig {@Beanpublic LockProvider lockProvider(DataSource dataSource) {return new JdbcTemplateLockProvider(dataSource);}
}@Service
public class ShedLockTask {@Scheduled(cron = "0 0/5 * * * ?")@SchedulerLock(name = "reportTask", lockAtLeastFor = "5m")public void scheduledTask() {// 保证同一时间只有一个实例执行}
}
四、化神篇:监控与管理
4.1 暴露执行端点(Spring Boot Actuator)
# application.yml
management:endpoints:web:exposure:include: scheduledtasksendpoint:scheduledtasks:enabled: true
访问/actuator/scheduledtasks
查看所有定时任务:
{"cron": [{"runnable": {"target": "com.example.MyTask.task3"},"expression": "0 0/5 9-18 * * MON-FRI"}],"fixedDelay": [],"fixedRate": []
}
4.2 自定义任务监控(天眼通)
@Bean
public ScheduledTaskPostProcessor taskPostProcessor() {return new ScheduledTaskPostProcessor() {@Overridepublic void postProcessAfterInitialization(Object bean, String beanName) {// 监控所有定时任务初始化System.out.println("已加载定时任务: " + beanName);}};
}
五、大乘篇:最佳实践
5.1 任务执行日志记录
@Aspect
@Component
public class TaskLogAspect {@Around("@annotation(scheduled)")public Object logTask(ProceedingJoinPoint pjp, Scheduled scheduled) throws Throwable {String taskName = pjp.getSignature().toShortString();long start = System.currentTimeMillis();try {System.out.println("任务开始: " + taskName);return pjp.proceed();} finally {System.out.printf("任务结束: %s, 耗时: %dms%n", taskName, System.currentTimeMillis() - start);}}
}
5.2 异常处理策略
@Scheduled(fixedRate = 5000)
public void errorProneTask() {try {// 业务代码...} catch (Exception e) {// 1. 记录异常到数据库// 2. 发送报警邮件// 3. 根据策略决定是否重试System.err.println("任务执行失败: " + e.getMessage());}
}
渡劫指南:常见问题
问题 | 解决方案 |
---|---|
任务不执行 | 检查@EnableScheduling 是否启用 |
Cron表达式无效 | 使用在线工具校验表达式 |
多任务串行执行 | 配置TaskScheduler 线程池 |
分布式环境重复执行 | 集成ShedLock或Redis分布式锁 |
时区问题 | 设置spring.task.scheduling.pool.size |
相关文章:
Spring定时任务修仙指南:从@Scheduled到分布式调度的终极奥义
各位被Thread.sleep()和while(true)折磨的Spring道友们!今天要解锁的是Spring生态自带的定时任务三件套——Scheduled、TaskScheduler、Async定时组合技!无需引入外部依赖,轻松实现从简单定时到分布式调度的全场景覆盖!准备好抛弃…...
Node.js多版本共存管理工具NVM(最新版本)详细使用教程(附安装包教程)
目录 前言 一、Nvm下载 二、Nvm安装 三、配置nodeJS 前言 NVM(Node Version Manager)是一个用于管理多个Node.js版本的工具,主要帮助开发者在同一设备上轻松安装、切换和卸载不同版本的Node.js,解决项目间版本冲突问题。 一、…...
管道魔法木马利用Windows零日漏洞部署勒索软件
微软披露,一个现已修复的影响Windows通用日志文件系统(CLFS)的安全漏洞曾被作为零日漏洞用于针对少数目标的勒索软件攻击中。 01 攻击目标与漏洞详情 这家科技巨头表示:"受害者包括美国信息技术(IT)…...
Devops之Argo:Argo 是什么,和现在常用的Jenkins之间的区别
Argo CD(Argo Continuous Delivery 的缩写)是一款基于 GitOps 的声明式 Kubernetes 持续交付工具。它提供了一种以 Git 为中心的方法来管理和部署应用程序到 Kubernetes 集群。Argo CD 遵循 GitOps 的原则,即将应用程序的预期状态存储在 Git …...
从 60 FPS 掉帧到 7.6 倍提速Rust + WebAssembly 优化《生命游戏》的实战指南
一、构建 FPS 统计器:用 performance.now() 实时观察性能变化 要优化,就要先 测量。我们在 JavaScript 端添加一个 fps 对象,结合 performance.now() 来监控每一帧的耗时,并统计最近 100 帧的平均 FPS、最小 FPS、最大 FPS&#…...
jmeter 集成ZAP进行接口测试中的安全扫描 实现方案
以下是将 JMeter 集成 ZAP(OWASP Zed Attack Proxy)进行接口测试中安全扫描的实现方案: 1. 环境准备 JMeter 安装:从 JMeter 官方网站(https://jmeter.apache.org/download_jmeter.cgi)下载并安装 JMeter,确保其版本稳定。ZAP 安装:从 ZAP 官方网站(https://www.zapr…...
Hyperlane 文件分块上传服务端
Hyperlane 文件分块上传服务端:高效、可靠、易用的文件上传解决方案 引言 在现代 Web 开发中,文件上传是许多应用的核心功能之一。然而,随着文件大小的增加和网络环境的复杂性,传统的单次文件上传方式已经难以满足需求。Hyperla…...
BT面板docker搭建excalidraw遇到的问题
1.傻瓜式拉取镜像 2.点击创建容器 3.暴露端口 4.放行端口和服务器安全组,如果用的是轻量型服务器,那就关闭防火墙 下面放图...
Qt之OpenGL使用Qt封装好的着色器和编译器
代码 #include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}unsigned int VBO,VAO; float vertices[]{0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f };unsigned int indices[]{0,1,3,1,2,3, }; unsigned int EBO; sunOpengl::~sunO…...
【仿Mudou库one thread per loop式并发服务器实现】项目介绍+前置技术知识点
HTTP协议模块实现 1. 项目实现的目标2. 项目储备知识2.1 HTTP服务器2.2 Reactor模型 3. 功能模块划分3.1 SERVER模块3.1.1 Buffer模块3.1.2 Socket模块3.1.3 Channel模块3.1.4 Poller模块3.1.5 EventLoop模块3.1.6 Connection模块3.1.7 7. Acceptor模块3.1.8 TimerQueue模块3.1…...
Open Interpreter:重新定义人机交互的开源革命
引言 在人工智能技术蓬勃发展的今天,人机交互的方式正经历着前所未有的变革。Open Interpreter,作为一个开源项目,正在重新定义我们与计算机的互动方式。它允许大型语言模型(LLMs)在本地运行代码,通过自然…...
Shell编程之条件语句
目录 一.条件测试操作 1.文件测试 2.整数值比较 3.字符串比较 4.逻辑测试 二:if条件语句 1.if语句的结构 (1)单分支if语句 (2)双分支if语句 (3)多分支if语句 2.if语句应用示例 &…...
Python编程快速上手 让繁琐工作自动化笔记
编程基础 字符串使用单引号...
高性能文件上传服务
高性能文件上传服务 —— 您业务升级的不二选择 在当今互联网数据量激增、文件体积日益庞大的背景下,高效、稳定的文件上传方案显得尤为重要。我们的文件分块上传服务端采用业界领先的 Rust HTTP 框架 Hyperlane 开发,凭借其轻量级、低延时和高并发的特…...
【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘
对象的创建 1.类加载检查 虚拟机遇到一条new的指令,首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行类的加载过程。 2.分配内存 在类…...
浅谈前端开发中的 npm、cnpm、pnpm、yarn各自特点
在前端开发中的 npm、cnpm、pnpm、yarn 等工具都是包管理器(Package Manager),用于安装/更新/卸载 JavaScript 项目的依赖。 下面我详细地给你梳理下这些包管理器的作用、特点和适用场景👇 一. npm(Node Package Mana…...
【数据结构】包装类和泛型
目录 1.包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 1.3 自动装箱和自动拆箱 2.泛型 2.1泛型的概念 2.2引出泛型 3.语法 4.泛型类的使用 5.泛型的上界 1.包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基…...
红帽9运行容器一
运行容器:容器概念,构建,存储和运行容器的核心技术(用户资源管理的控制组,进程隔离的命名空间,加强安全边界的SELinux和Seccomp) 软件运行需要环境,系统库,配置文件和服…...
使用poi+itextpdf把word转成pdf
使用 Apache POI 和 iTextPDF 将 Word 转换为 PDF 需要分两步操作:先用 POI 读取 Word 内容,再用 iText 生成 PDF。 apache poi官方文档:Apache POI™ - Javadocs 以下是详细的代码实现示例: 环境准备 在 pom.xml 中添加依赖: …...
民安智库:开启零售行业客户满意度提升新征程
在当今这个瞬息万变的商业世界中,零售市场的竞争愈发激烈,犹如一场没有硝烟的战争。各大零售企业为了抢占市场份额,纷纷使出浑身解数,从商品种类的丰富到店铺环境的优化,从价格策略的调整到服务质量的提升,…...
自行搭建一个Git仓库托管平台
1.安装Git sudo apt install git 2.Git本地仓库创建(自己选择一个文件夹) git init 这里我在 /home/test 下面初始化了代码仓库 1. 首先在仓库中新建一个txt文件,并输入一些内容 2. 将文件添加到仓库 git add test.txt 执行之后没有任何输…...
无锡无人机超视距驾驶证怎么考?
无锡无人机超视距驾驶证怎么考?在近年来,无人机技术的迅猛发展使得无人机的应用场景变得愈发广泛,其不仅在环境监测、农业喷洒、快递配送等领域展现出真金白银的价值,同时也推动了无人机驾驶证的需求。尤其是在无锡,随…...
pyautogui是什么:自动化鼠标和键盘操作
pyautogui是什么:自动化鼠标和键盘操作 目录 pyautogui是什么:自动化鼠标和键盘操作安装方法主要功能及使用示例1. 鼠标操作2. 键盘操作3. 获取屏幕信息应用场景注意事项pyautogui 是一个用于自动化鼠标和键盘操作的 Python 第三方库,它允许开发者通过编写 Python 代码来模拟…...
小白学习java第12天:IO流之缓冲流
1.IO缓冲流: 之前我们学习的都是原始流(FileInputStream字节输入流、FileOutputStream字节输出流、FIleReader字符输入流、FIleWriter字符输出流)其实我们可以知道对于这些其实性能都不是很好,要么太慢一个一个,要么就…...
智能导诊系统方案:人体画像导诊实现从症状到科室推荐及院内导航链路拆解(python示范 TensorFlow Embedding 层源码)
本文面向医院信息科负责人、医疗AI开发者、医院管理者,解决传统分诊依赖人工经验,效率低且易出错;患者跨科室就诊路径不清晰等痛点问题,实现症状到科室的精准推荐及动态导航链路优化。 如需获取智慧医院导航导诊系统解决方案请前往…...
声学测温度原理解释
已知声速,就可以得到温度。 不同温度下的胜诉不同。 25度的声速大约346m/s 绝对温度-273度 不同温度下的声速。 FPGA 通过测距雷达测温度,固定测量距离,或者可以测出当前距离。已知距离,然后雷达发出声波到接收到回波的时间&a…...
30天学Java第九天——线程
并行与并发的区别 并行是多核 CPU 上的多任务处理,多个任务在同一时间真正的同时执行并发是单核 CPU 上的多任务处理,多个任务在同一时间段内交替执行,通过时间片轮转实现交替执行,用于解决 IO 密集型任务的瓶颈 线程的创建方式…...
SaaS微服务架构的智慧工地源码,基于Spring Cloud +UniApp +MySql开发
基于微服务架构JavaSpring Cloud UniApp MySql技术开发,saas模式的一套智慧工地云平台源码,支持多端展示:PC端、大屏端、手机端、平板端。包含项目人员管理、视频监控管理、危大工程监管、绿色施工管理、现场物料管理、安全隐患排查等功能。 …...
Qt学习笔记——TableWidget的一些学习东西
TableWidget的一些学习东西 使用QtDesigner绘制表格,但是表格出现很多问题,烦死了,整理了一些内容。 在使用 Qt Designer 设置 QTableWidget 时,涉及大量属性选项,尤其是在初学阶段常常因为属性设置不当而导致表格显…...
《Uniapp-Vue 3-TS 实战开发》Pinia 及 Pinia 持久化
前言: 正文: 一、Pinia 基础用法 1. 安装与初始化 bash npm install pinia # 或 yarn add pinia 在 main.js/ts 中初始化: import { createApp } from vue import { createPinia } from pinia import App from ./App.vue const app = createApp(App) app.use(createPinia()…...
JAVA:SpringBoot 实现图片防盗链的技术指南
1、简述 防盗链(Hotlink Protection)是一种保护网站资源不被其他网站直接引用的技术,特别是在图片、视频等静态资源方面。防盗链的核心思想是检查请求的来源(Referer),只允许来自指定域名的请求访问资源。 在 Spring Boot 中,我们可以通过拦截器(Interceptor)或过滤…...
量子指纹识别
场景设定 某金融机构部署量子指纹认证系统,要求用户通过手机(传感器A)注册指纹,并在ATM机(传感器B)完成量子安全认证。系统需满足: 抗模板泄露:即使数据库被攻破,攻击者…...
图像变换方式区别对比(Opencv)
1. 变换示例 import cv2 import matplotlib.pyplot as plotimg cv2.imread(url) img_cut img[100:200, 200:300] img_rsize cv2.resize(img, (50, 50)) (hight,width) img.shape[:2] rotate_matrix cv2.getRotationMatrix2D((hight//2, width//2), 50, 1) img_wa cv2.wa…...
快速上手Linux联网管理
RHEL9版本特点 在RHEL7版本中,同时支持network.service和NetworkManager.service(简称NM)。在RHEL8上默认只能通过NM进行网络配置,包括动态ip和静态ip,若不开启NM,否则无法使用网络RHEL8依然支持network.service&…...
加速度计芯片的主要参数定义、计算、测试方法
加速度计的主要参数包括量程、分辨率、灵敏度、输出数据速率、接口类型、功耗、噪声等。量程决定了加速度的测量范围,比如2g到16g,不同的应用需要不同的量程。分辨率关系到能检测到的最小变化,通常用位数表示,比如12位或16位。灵敏…...
FFMPEG大文件视频分割传输教程,微信不支持1G文件以上
如下是一个2.77g的文件分割教程 . 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑,是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FF…...
interfaceResidue:一款用于分析蛋白复合物“接触界面残基”的pymol插件
当我们使用AF3或其他结构预测工具获得蛋白复合物后,逃不掉的一步就是分析接触界面的残基互作,而分析互作的前提是要准确地识别出接触界面上的残基有哪些,如果手动找则太耗费精力而且也容易遗漏。本期向大家安利的这样一款pymol插件࿰…...
【Qt】常用控件【按钮类】
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 前言 二:🔥 按钮类控件 🦋 Push Button 按钮🎀 带有图标的按钮 -- 纯代码实现🎀 带有快捷键的按钮…...
996引擎-源码学习:PureMVC Lua 中的系统启动,初始化并注册 Mediator
996引擎-源码学习:PureMVC Lua 中的系统启动,初始化并注册 Mediator 一、PureMVC 核心架构二、系统启动流程系统启动注册 StartUp 通知发送 StartUp 通知,开始初始化三、Mediator 初始化1. gameStateInit.lua2. LoadingBeginCommand.lua3. RegisterWorldMediatorCommand.lua…...
SDP(一)
SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明:SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明:发起者/创建者 会话ID,那么该I…...
深入理解Apache Kafka
引言 在现代分布式系统架构中,中间件扮演着至关重要的角色,它作为系统各组件之间的桥梁,负责处理数据传递、消息通信、负载均衡等关键任务。在众多中间件解决方案中,Apache Kafka凭借其高吞吐量、低延迟和可扩展性,已…...
【AI News | 20250411】每日AI进展
AI Repos 1、docext docext是一款无需OCR的本地化文档信息提取工具,利用视觉语言模型(VLM)从发票、护照等文档图像中高效提取结构化字段和表格数据。其支持自定义字段或预置模板,提供置信度评分、多页处理及REST API集成…...
风暴之眼:在AI重构的数字世界重绘职业坐标系
硅谷的某个深夜,GitHub Copilot在程序员的注视下自动生成出完美代码,这个场景正在全球数百万开发者的屏幕上同步上演。当AI生成的代码通过图灵测试,当机器学习模型开始理解业务需求,一个根本性命题浮出水面:在人类亲手…...
关于深度学习局部视野与全局视野的一些思考
关于深度学习局部视野与全局视野的一些思考 最近,我在学习一个基于Transformer的网络模型时,注意到了一些局部特征和全局特征的概念。引发了一些疑问: 为什么说CNN只能看到局部区域,而transformer能看到全局区域?什么是token? 对于图像中…...
Asp.NET Core WebApi 配置文件
在 ASP.NET Core Web API 中,配置文件(如 appsettings.json)是管理应用程序设置的核心部分。ASP.NET Core 提供了一套灵活的配置系统,允许开发者从多种来源加载配置数据,并根据需要使用这些配置。 以下是关于如何在 A…...
免费的AI原创文章批量生成工具,站长内容更新工具推荐
说到AI生成文章,现在已经不是什么热门话题了,因为国内有很多的AI模型现在也越来越成熟了,那么科技工具的出现就是为人民服务的,我们要合理的用好它。 今天给大家推荐的是一款很厉害的站长网站内容更新工具,它可以利用…...
在ASP.NET Core 中实现幂等API和WinForms客户端防重提交实践
前言 大家好,欢迎关注dotnet研习社。今天,我想和大家聊聊在 ASP.NET Core 中如何实现幂等 API,这是我们在实际项目开发中非常重要、但又常常被忽略的一个话题。 什么是幂等性? 幂等性(Idempotency)指的是…...
Vue如何利用Postman和Axios制作小米商城购物车
小编最近太忙了,没来得及更新博客!上一条博客我们写了小米商城购物车的简版,今天我们就在简版的基础之上来增加一些功能,写一下数量的加减、总价、删除(批量删除)、全选取消全选等功能。如果上一条博客没有…...
使用Windows工具进行内存取证(不进行完全内存转储)
内存取证是分析易失性内存以发现恶意活动、恶意软件行为或系统异常的强大技术。一般情况下调查员会转储全部物理内存,并使用Volatility等工具对其进行分析。然而在许多实际场景中,由于系统限制、安全策略或紧迫性等原因,完全转储可能并不可行…...
大厂文章阅读
1.异步任务处理系统,如何解决业务长耗时、高并发难题? 1)任务失败如何处理(CAS失败也可用):1.指数退避,匹配下游任务执行系统的处理能力。比如收到下游任务执行系统的流控错误,或者感知到任务执行成为瓶颈,需要指数退…...