SpringBoot——Scheduled定时任务

news2024/7/6 19:39:25

目录

1.静态定时任务

2.动态定时任务


在一些业务场景中,我们需要定义一些任务在我们指定的时间或是每隔一个时间段就自动执行,来作为任务的前提,保证业务的执行。比如:我们需要一个定时任务,每天早上6点执行,对数据库中的某个日期字段进行修改,修改为当天时间。

1.静态定时任务

springboot中为我们提供了自带的定时任务。

首先,我们需要让项目能使用定时任务:

@EnableScheduling
@SpringBootApplication
public class CourtSeckillMain {
    public static void main(String[] args) {
        SpringApplication.run(CourtSeckillMain.class,args);
    }
}

然后,我们需要在业务类中编写代码:

    @Override
    @Scheduled(cron = "0 0 6 * * ?")
    //秒 分 时 日 月 周 年(可选);*表所有可能的值,-指定范围值,/表示步长
    public void doScheduleTask(){
        log.info("执行定时任务");
        //这里是你的业务逻辑
    }

 上述代码称为静态定时任务,主要依靠 @Scheduled 标签实现,根据其参数cron表达式每隔时间间隔自动执行任务。

cron参数:cron表达式中可填6个值,分别对应 秒 分 时 日 月 周 年。* 表所有可能的值,- 指定范围值,/ 表示步长,?表示不指定值即该值不影响。

0 0 6 * * ?    表示每天6点执行任务
0/5 * * * * ?   表示每5秒执行一次任务
0 * 6 * * ?    表示每天的6点-7点之间的每一分钟都执行一次
0 * 6-8 * * ?  表示每天的6点-9点之间的每一分钟都执行一次
5 10 6 * * ?   表示每天的6:10:05执行一次
0 10,44 14 ? 3 WED  表示三月的每周三的14:10和14:44触发

静态定时任务通过 @Scheduled 标签指定好执行时间,从而执行定时任务,使用较为方便但不太灵活,指定好执行时间后则无法更改。

2.动态定时任务

如果我们需要动态修改定时任务的cron值,我们可以通过继承 SchedulingConfigurer 类来实现:

@Data
@Slf4j
@Component
@ConfigurationProperties(prefix = "scheduled.task")
public class ScheduleTask implements SchedulingConfigurer {

    private String cron;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
            // 业务代码
            log.info("定时任务,currentTime:{}", LocalDateTime.now());

        }, triggerContext -> {
            // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
            CronTrigger cronTrigger = new CronTrigger(cron);
            return cronTrigger.nextExecutionTime(triggerContext);
        });
    }
}

application.yml中存放初始的cron值:

scheduled:
  task:
    cron: "0/5 * * * * ?"    #每5秒执行一次

在controller中编写接口,动态修改cron值:

@RestController
@RequiredArgsConstructor
public class seckillController {

    private final ScheduleTask scheduleTask;

    @GetMapping("/test")
    public String test(@RequestParam("cron") String cron){
        scheduleTask.setCron(cron);
        log.info("修改cron为:{}",scheduleTask.getCron());
        return scheduleTask.getCron();
    }

}

然后我们运行程序,并通过接口修改cron值:

可以看到,修改之前,每5秒执行一次定时任务;我们将cron修改为每天10点内的每分钟执行后,变成了每分钟才执行一次。

由此实现了自定义的定时任务,并由接口动态修改定时任务的执行时间。

需要注意的是:每次修改完定时任务执行时间之后,需要执行完上一次的定时任务才会让新定义的执行时间生效。

我们由 ScheduleTask.configureTasks() 方法中的上述代码 可以看到,指定下一次任务的执行间隔是由 cronTrigger.nextExecutionTime(triggerContext) 实现的,而该方法会在一次定时任务执行完结后才调用。

ScheduleTask.configureTasks() 方法中指定定时任务执行间隔)

所以,我们在上述运行结果中看到,在10:28:30秒执行完一次定时任务,然后在10:28:32我们对cron值进行了修改,定时任务任然按照 0/5 * * * * ? 这一cron值执行了一次,然后才配置了新的cron值。

换言之,如果我们定义了任务每天6点执行,然后某一天将其修改为12点执行,springboot会在第二天的6点执行完后再将cron值修改,然后12点再执行一次。

所以会一定程度上存在重复执行的问题,如果业务需要规避,请谨慎考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【springcloud 微服务】Spring Cloud Alibaba Nacos使用详解

目录 一、前言 二、nacos介绍 2.1 什么是 Nacos 2.2 nacos 核心能力 2.2.1 服务发现和服务健康监测 2.2.2 动态配置服务 2.2.3 动态 DNS 服务 2.2.4 服务及其元数据管理 2.2.5 nacos生态地图 2.3 与其他配置中心对比 三、nacos快速部署 3.1 获取安装包 3.2 修改脚…

【分享NVIDIA GTC 23大会干货】加速生成式AI在生物学和医疗领域的应用

【分享NVIDIA GTC 23大会干货】加速生成式AI在生物学和医疗领域的应用1. NVIDIA医疗领域AI计算平台——NVIDIA CLARA2. NVIDIA CLARA医学影像子平台——MONAI3. NVIDIA CLARA医疗设备子平台——Holoscan4. NVIDIA基因组学解决方案Parabricks5. NVIDIA药物研发解决方案6. 个人思…

互联网医院源码|互联网医院软件体现智慧医疗的优势

现在大家看病一般都会直接在互联网医院平台上去就诊,每次大家需要看病时,可以在手机上直接去预约指定的医生,同城周边的所有医院都是可以去直接选择的,这样也可以去帮助大家节省很多的看病时间,在互联网医院软件中所具…

【ApiPost】实现【gRPC】调试【上手篇】

ApiPost下载地址 下载中心-Apipost-中文版接口调试与文档管理工具Apipost官方下载中心为您提供Apipost软件最新版本,其中包括Windows、Mac、Linux等多个客户端的安装包,Apipost下载就上Apipost.cn,国内专业的接口测试软件,一键生成API文档。https://www…

中核科技:科技匠心 智启未来

​  2023 年4月 13—15 日,2023年易派客工业品展览会、石油石化工业展览会、第七届中国石油和化工行业采购年会,在苏州国际博览中心胜利召开。本次展会展览面积53000平方米,参展企业500余家,汇集了中国工业制造领域的大型国企央…

Parcel 实践指南

Parcel 是一个极速零配置的 Web 应用程序打包器。它的零配置特性使得开发者可以更快速地进行项目的构建。本文将向你展示如何在项目中实践 Parcel,并讨论一些性能优化策略以及不同场景下的最佳实践。 总结 Parcel 是一个强大而灵活的打包工具,它可以让你…

【Python_Scrapy学习笔记(八)】基于Scrapy框架实现多级页面数据抓取

基于Scrapy框架实现多级页面数据抓取 前言 本文中介绍 如何基于 Scrapy 框架实现多级页面数据的抓取,并以抓取汽车之家二手车数据为例进行讲解。 正文 在介绍如何基于 Scrapy 框架实现多级页面数据的抓取之前,先介绍下 Scrapy 框架的请求对象 reques…

Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!

在Linux操作系统中,XXD是一个十六进制dump工具,可以将二进制文件转换为十六进制表示,并以可读的形式显示。XXD命令可用于显示文件内容、编辑文件等用途。本文将介绍如何在Linux中使用XXD命令。 安装XXD命令 通常情况下,XXD命令已…

Java面试题总结 | Java基础部分2(持续更新)

文章目录反射的优缺点BIO、AIO、NIO同步异步概念**阻塞与非阻塞****BIO****NIO****AIO**总结设计模式的好处设计模式一定是好用的吗Integer.ValueOf和new Integer的区别Integer.parseInt(s)与Integer.valueOf(s)的区别String是线程安全的吗?StringBuffer和StringBui…

开源GPT-4小羊驼(Vicuna)快速上手指南

小羊驼(Vicuna)是什么 Vicuna: 一个开源的GPT,宣称实现了GPT-4 90%的功能。 UC伯克利学者联手CMU、斯坦福等,再次推出一个全新模型70亿/130亿参数的Vicuna,俗称「小羊驼」(骆马)。 并且和其他以往不同的是…

数据库管理-第六十五期 Oracle 23c新特性(20230411)

数据库管理 2023-04-11第六十五期 Oracle 23c新特性1 免费版23c目录结构2 新特性总结第六十五期 Oracle 23c新特性 上一期装了免费版23c,这一期根据安装的数据库,对Oracle 23c的部分新特性进行实验展示。 1 免费版23c目录结构 通过RPM包安装的免费版2…

静态时序分析Static Timing Analysis1——STA概述、标准工艺库、时钟、IO约束的建立

文章目录前言一、静态时序分析概述1、时序路径分类2、STA和动态仿真比较3、PVT4、不同时钟域5、建立时间、保持时间6、恢复时间、移除时间二、标准工艺库1、标准单元延时模型2、slew derate三、STA约束的建立1、时钟约束1.1 时钟定义1.2 时钟不确定性1.3 时钟延时1.4 生成时钟2…

2023年4月的编程语言排行榜,有你中意的开发语言吗?

编程世界变幻莫测,编程语言也是层出不穷,每隔一段时间就有新的风口出现。2023年的风口非人工智能莫属,人工智能领域中不可获取的编程语言就是Python,作为在算法、数据方面有独特优势的编程语言,从去年开始就展现了它不…

Linux03——文件系统及结构、命令

目录 一、前言 二、文件目录 三、文件系统 四、文件目录命令 五、系统信息命令 六、通讯网络命令 七、磁盘类命令 八、进程管理命令 一、前言 Linux特点是开放性遵循OSI国际标准;多用户每个用户有各自权限;多任务;GUI和系统调用界面&…

Java每日一练(20230411)

目录 1. 同构字符串 🌟 2. 随机字符串 🌟 3. 交错字符串 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 同构字符串 给定两个…

京东技术专家首推:Spring微服务架构设计,GitHub星标128K

前言 本书提供了实现大型响应式微服务的实用方法和指导原则,并通过示例全面 讲解如何构建微服务。本书深入介绍了Spring Boot、Spring Cloud、 Docker、Mesos和Marathon,还会教授如何用Spring Boot部署自治服务,而 无须使用重量级应用服务器…

SAP开发环境ABAP的搭建(客户端和服务器),Developer Key和AccessKey的绕过方法

目录 一.前言 二.客户端GUI安装 1.下载好SAP GUI 750 2.解压后找到SAPGUISetup.exe 3.安装 4.安装完整教程 三.服务端搭建 1.安装VmWare虚拟机 2.下载虚拟机镜像 3.打开虚拟机 4.调整内存大小 5.启动虚拟机 四.创建程序 1.创建包 2.创建程序 3.Developer Key和A…

C语言——变参函数

一、定义 一般函数的参数列表是固定的,所以在调用时传入的实参的个数和格式必须和实参匹配;在函数式中,不需要关心实参,直接调用形参即可。 变参函数,就是参数的个数及类型都不确定的函数,常见变参函数如pr…

jenkins的slave节点构建java失败

背景: 主节点构建没问题的,为了缓解压力增加了个从节点,但是发现同个应用分配到从节点构建时报错,主节点构建就正常。但是我的从节点是把主节点克隆过去的, 理论环境配置java——maven啥都是一模一样才是。不理解。 …

Markdown基础语法:快速入门指南

什么是Markdown Markdown是一种轻量级的标记语言,它的目标是让文本内容更加易读、易写和易于转换成HTML等格式。Markdown语法简单、直观,适合用于写作、博客、笔记、文档等场景。Markdown最初由John Gruber和Aaron Swartz于2004年创建,现在已…