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

Spring Task详细讲解

✨Spring Task简介

Spring Task 是 Spring 提供的轻量级定时任务工具,也就意味着不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。

使用场景:

  • 信用卡每月还款提醒
  • 银行贷款每月还款提醒
  • 火车票售票系统处理未支付订单
  • 入职纪念日为用户发送通知

只要是需要定时处理的场景都可以使用Spring Task

 

✨Spring Task中的cron表达式

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间。

构成规则:分为6或7个域,由空格分开,每个域代表一个含义:

秒   分   时   日   月   周   年

每个域的含义分别为:秒,分钟,小时,日,月,周,年(可选)

注意:(周 和 日 不能同时出现,若一定要同时出现,则其中一个必须为“ ?”,因为会产生冲突)

特殊字符:

  • *:代表所有可能的值
  • ?:不指定值,用于日和周字段,表示不关心具体值
  • -:指定一个范围
  • ,:列出多个值
  • /:指定增量
  • L:表示最后一个,例如月的最后一个星期日
  • W:表示最接近指定日期的工作日
  • #:表示第几个,例如周的第几个星期日

更详细的 Cron 表达式示例:

  • 0 0 12 * * ?:每天中午12点触发
  • 0 15 10 ? * MON-FRI:周一至周五每天上午10:15触发
  • 0 0/5 * * * ?:每5分钟触发
  • 0 0 1,12 * * ?:每天凌晨1点和中午12点触发
  • 0 10 1 * * 6L:每个月的最后一个星期五上午10:10触发
  • 0 0 10 ? * 2#3:每个月的第三个星期二上午10:00触发
     

✨基于 @Scheduled 注解的使用:

1、导入maven坐标spring-context(一般是已经存在的)

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>

2、启动类添加注解@EnableScheduling开启任务调度

@SpringBootApplication
@EnableScheduling   //开启定时任务
public class MyApplication {// ...
}

3、创建定时任务,采用注解的方式,主要是cron表达式

@Component
public class ScheduledTasks {private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");// 每5秒执行一次@Scheduled(fixedRate = 5000)public void fixedRateTask() {System.out.println("Fixed Rate Task : " + dateFormat.format(new Date()));}// 每分钟执行一次@Scheduled(cron = "0 * * * * ?") // 注意:此处纠正了cron表达式public void cronTask() {System.out.println("Cron Task : " + dateFormat.format(new Date()));}// 上一次任务执行完成后,延迟10秒再执行@Scheduled(fixedDelay = 10000)public void fixedDelayTask() {System.out.println("Fixed Delay Task : " + dateFormat.format(new Date()));try {Thread.sleep(5000); // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}}// 使用字符串配置,更灵活,支持占位符@Scheduled(fixedRateString = "${my.fixedRate}") // application.properties 中配置 my.fixedRate=6000public void fixedRateStringTask() {System.out.println("Fixed Rate String Task : " + dateFormat.format(new Date()));}
}

✨基于 SchedulingConfigurer 接口的使用

@Configuration
public class TaskSchedulerConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(taskExecutor());}@Bean(destroyMethod="shutdown")public Executor taskExecutor() {ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 设置线程池大小为5executor.setRemoveOnCancelPolicy(true); // 设置取消策略executor.setThreadNamePrefix("MyScheduled-"); // 设置线程名前缀return executor;}
}

✨异步任务

为了避免阻塞主线程,可以将耗时的定时任务设置为异步执行。

@Component
public class AsyncScheduledTasks {@Async@Scheduled(fixedRate = 5000)public void asyncTask() {// ... 执行耗时操作 ...}
}@Configuration
@EnableAsync // 开启异步任务支持
public class AsyncConfig implements AsyncConfigurer {// ... 配置异步任务线程池 ...
}

 

✨使用案例:

1、首先启动类添加注解@EnableScheduling

@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching      //开启注解方式的事务管理
@EnableScheduling   //开启任务调度
public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info("server started");}
}

2、task定时方法

@Component
@Slf4j
public class MyTask {/***定时任务,每5秒执行一次*/@Scheduled(cron="0/5 * * * * ?")public void executeTask(){log.info("定时任务开始执行:{}",new Date());}
}

运行结果:每5秒执行一次:

3c474c9fba34403cbe8961020532ee0f.png
 

b1e5c92a80b757e5a176018b5609ef9e.gifb1e5c92a80b757e5a176018b5609ef9e.gifb1e5c92a80b757e5a176018b5609ef9e.gif总结:

综上所述,Spring Task是Spring框架中非常强大且灵活的任务调度工具。它提供了简单易用的注解和配置方式,支持基于cron表达式的定时任务调度和异步任务处理。通过合理配置和使用Spring Task,开发者可以轻松地实现各种复杂的定时任务需求。

aed057e1bed2414188b593c3a4300019.gif

                        
参考链接:https://blog.csdn.net/weixin_64178283/article/details/142874340

 

相关文章:

Spring Task详细讲解

✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具&#xff0c;也就意味着不需要再添加第三方依赖了&#xff0c;相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒…...

C++初阶 --- 类和对象(1)

类和对象&#xff08;1&#xff09; 一、类的相关内容1.访问限定符2.class关键字与struct关键字的区别3.类域 二、this指针三、成员函数存放在哪里&#xff1f;1. 函数的存放位置2. 练习题 一、类的相关内容 1.访问限定符 &#xff08;1&#xff09;C⼀种实现封装的⽅式&…...

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接

《TCP/IP网络编程》学习笔记 | Chapter 7&#xff1a;优雅地断开套接字连接 《TCP/IP网络编程》学习笔记 | Chapter 7&#xff1a;优雅地断开套接字连接基于 TCP 的半关闭单方面断开连接带来的问题套接字和流针对优雅断开的 shutdown 函数为何需要半关闭&#xff1f;基于半关闭…...

Anaconda 和 conda 是什么关系?就像 pip 和 python 一样吗

Anaconda 和 conda是 Anaconda Distribution 还是 Miniconda Anaconda 和 conda Anaconda 和 conda 之间的关系有点类似于 pip 和 Python&#xff0c;但又有所不同。 Anaconda 是一个数据科学和机器学习的发行版&#xff0c;它包含了 Python、conda 以及许多预装的库和工具&am…...

「数据治理」核心专业术语解释!

​数据治理就是指在一定的组织范围内&#xff0c;依托制度法规、标准规范、应用实践和支撑技术对数据进行全生命周期的数据确权、质量管理、安全控制、隐私保护、开放共享、交易流通和分析处理。数据治理的目标是为了提高数据的可用性、安全性、流通性&#xff0c;激活数据资源…...

Mac Nginx 前端打包部署

安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装Nginx brew install nginx nginx相关命令 nginx启动命令&#xff1a;nginx nginx -s reload #重新加载配置 nginx -s reopen #重启 nginx -s stop #…...

乳腺癌诊断分析——基于聚类分析实现

一、研究背景 乳腺癌属于恶性肿瘤&#xff0c;在早期发现后需要及早将病变组织切除&#xff0c;而且术后还要化疗和放射等辅助治疗&#xff0c;能够抑制癌细胞的扩散和增长。 二、研究目的 研究乳腺癌病人的患病特征通过聚类分析方法对特征进行分类通过上述聚类结果对乳腺诊…...

Ubuntu 22.04 安装配置opencv

​ OpenCV下载:https://opencv.org/releases/ ​编译与安装 安装cmake OpenCV需要使用cmake进行编译 sudo apt-get install cmake安装依赖 sudo apt-get install build-essential pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev lib…...

【软考】系统架构设计师-计算机系统基础(3):嵌入式系统

嵌入式系统&#xff1a;嵌入式处理器、相关支撑硬件、嵌入式OS、支撑软件以及应用软件 嵌入式系统特征&#xff1a;专用性强、技术融合、软硬一体软件为主、通用计算机资源少,... 分层&#xff08;5层&#xff09;&#xff1a;硬件层 → 抽象层 → 操作系统层 → 中间件层 →…...

实测运行容器化Tomcat服务器

文章目录 前言一、拉取Tomcat 9.0镜像二、运行容器化Tomcat服务器三、访问Tomcat官网首页测试 总结 前言 运行容器化Tomcat服务器&#xff0c;首先确保正确安装docker&#xff0c;并且已启动运行&#xff0c;具体安装docker方法见笔者前面的博文《OpenEuler 下 Docker 安装、配…...

致敬苹果的国产手机,只会失去更多市场,iPhone一骑绝尘!

近期诸多国产手机品牌纷纷发布旗舰手机&#xff0c;随着这些旗舰手机的发布&#xff0c;可以看出他们在进一步致敬苹果--实质就是模仿苹果的设计&#xff0c;如此做的结果恐怕是得不偿失&#xff0c;将导致国产手机损失更多市场。 致敬苹果最为直接的当属手机外壳了&#xff0c…...

《MYSQL45讲》kill不掉的线程

kill query 线程id :终止这个线程正在执行的语句 kill connection 线程id :关闭这个线程的连接&#xff0c;也会先停止这个线程正在执行的语句。这个connection可以缺省。 本文讨论的情况是&#xff1a;使用了kill命令&#xff0c;却没有断开连接&#xff0c;show processli…...

单体架构 IM 系统之 Server 节点状态化分析

基于 http 短轮询模式的单体架构的 IM 系统见下图&#xff0c;即客户端通过 http 周期性地轮询访问 server 实现消息的即时通讯&#xff0c;也就是我们前面提到的 “信箱模型”。“信箱模型” 虽然实现非常容易&#xff0c;但是消息的实时性不高。 我们在上一篇文章&#xff08…...

java xml 文本解析

示例文本 <Message><MessageName>time_request</MessageName><Timestamp>20220217165432906359</Timestamp><Body><EQPID>CMMAB01-DTP01</EQPID></Body> </Message>示例代码 import org.w3c.dom.Document; impo…...

Docker占用空间太大磁盘空间不足清理妙招

docker占用空间太大了&#xff0c;磁盘空间不足&#xff0c;清理3妙招 清除所有已停止的容器&#xff08;container&#xff09;、未被任何容器所使用的卷&#xff08;volume&#xff09;、未被任何容器所关联的网络&#xff08;network&#xff09;、所有悬空镜像&#xff08…...

编程之路,从0开始:字符函数和字符串函数

Hello大家好&#xff01;很高兴我们又见面了&#xff01; 给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 目录 1、字符分类函数 2、字符转换函数 3、字符串函数 1、 strcpy 2、 strcat 3、 strcmp 4、strlen(s) 5、strstr(s1, s2) 6、 strtok(s1, s2…...

化工防爆巡检机器人:在挑战中成长,为化工安全保驾护航

随着全球能源需求的不断攀升&#xff0c;化工行业的安全性与高效性愈发受到关注。化工设施规模巨大&#xff0c;而且其中多数存在高风险因素&#xff0c;像是易燃易爆化学物质、高温环境、有毒有害物质以及高压设备等。仅2023年&#xff0c;国内危化品事故就多达652起&#xff…...

音频采样数据格式

音频信号在模拟到数字转换时&#xff0c;会涉及到多个关键参数&#xff0c;如采样率、位深度、通道数等。下面是常见的音频采样数据格式及其相关概念&#xff1a; 1. 采样率 (Sample Rate) 采样率指的是每秒钟对音频信号进行采样的次数&#xff0c;单位为赫兹 (Hz)。常见的值…...

【pytorch】常用强化学习算法实现(持续更新)

持续更新常用的强化学习算法&#xff0c;采用单python文件实现&#xff0c;简单易读 2024.11.09 更新&#xff1a;PPO(GAE); SAC2024.11.12 更新&#xff1a;OptionCritic(PPOC) "PPO" import copy import time import torch import numpy as np import torch.nn as …...

DAY59||并查集理论基础 |寻找存在的路径

并查集理论基础 并查集主要有两个功能&#xff1a; 将两个元素添加到一个集合中。判断两个元素在不在同一个集合 代码模板 int n 1005; // n根据题目中节点数量而定&#xff0c;一般比节点数量大一点就好 vector<int> father vector<int> (n, 0); // C里的一…...

Mybatis执行自定义SQL并使用PageHelper进行分页

Mybatis执行自定义SQL并使用PageHelper进行分页 基于Mybatis&#xff0c;让程序可以执行动态传入的SQL&#xff0c;而不需要在xml或者Select语句中定义。 代码示例 pom.xml 依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId&g…...

OpenCV DNN

OpenCV DNN 和 PyTorch 都是常用的深度学习框架&#xff0c;但它们的定位、使用场景和功能有所不同。让我们来对比一下这两个工具&#xff1a; 1. 框架和功能 OpenCV DNN&#xff1a;OpenCV DNN 模块主要用于加载和运行已经训练好的深度学习模型&#xff0c;支持多种深度学习…...

什么时候需要复写hashcode()和compartTo方法

在Java编程中&#xff0c;复写&#xff08;重写&#xff09;hashCode()和compareTo()方法的需求通常与对象的比较逻辑和哈希集合的使用紧密相关。但请注意&#xff0c;您提到的compartTo可能是一个拼写错误&#xff0c;正确的方法名是compareTo()。以下是关于何时需要复写这两个…...

PostgreSQL 日志文件备份

随着信息安全的建设&#xff0c;在三级等保要求中&#xff0c;要求日志至少保留半年 180 天以上。那么 PostgreSQL 如何实现这一要求呢。 我们需要配置一个定时任务&#xff0c;定时的将数据库日志 log 下的文件按照生成的规则将超过一定时间的日志拷贝到其它的路径下&#xf…...

2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 B题 城市轨道交通列车时刻表优化问题 原题再现&#xff1a; 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发&#xff08;或通过&#xff09;时刻&#xff0c;其在实际…...

数字农业产业链整体建设方案

1. 引言 数字农业产业链整体建设方案旨在通过数字化手段提升农业产业效率与质量&#xff0c;推动农业现代化进程。方案聚焦于资源数字化、产业数字化、全局可视化与决策智能化的实现&#xff0c;构建农业产业互联网平台&#xff0c;促进农业全流程、全产业链线上一体化发展。 …...

awk那些事儿:在awk中使用shell变量的两种方式

awk是Linux中一款非常好用的程序&#xff0c;可以逐行处理文件&#xff0c;并提供了强大的语法和函数&#xff0c;和grep、sed一起被称为“Linux三剑客”。 在使用awk处理文件时&#xff0c;有时会用到shell中定义的变量&#xff0c;由于在shell中变量的调用方式是通过$符号进…...

大数据面试题--kafka夺命连环问(后10问)

目录 16、kafka是如何做到高效读写&#xff1f; 17、Kafka集群中数据的存储是按照什么方式存储的&#xff1f; 18、kafka中是如何快速定位到一个offset的。 19、简述kafka中的数据清理策略。 20、消费者组和分区数之间的关系是怎样的&#xff1f; 21、kafka如何知道哪个消…...

智能量化交易的多样化策略与风险控制:中阳模型的应用与发展

随着金融市场的不断创新与发展&#xff0c;智能量化交易正逐渐成为金融投资的重要手段。中阳智能量化交易模型通过技术优势、策略优化与实时风险控制等多方面结合&#xff0c;为投资者提供了强有力的工具支持。本文将对中阳量化模型的技术细节、多策略组合与市场适应性进行深入…...

小皮PHP连接数据库提示could not find driver

最近遇到一个奇怪的问题&#xff0c;我的小皮上安装的8.0.2版本的php连接数据库正常。下载使用8.2.9时&#xff0c;没有php.ini,把php-development.ini改成 php.ini后&#xff0c;就提示could not find driver。 网上查了说把php.ini里的这几个配置打开&#xff0c;我也打开了&…...