SpringBoot使用@Scheduled实现定时任务

news2024/9/24 21:18:56

前言

Spring3.0版本之后就自带定时任务,提供了@EnableScheduling和@Scheduled这两个注解来实现定时任务的功能。

创建定时任务也变得尤为简单。

创建过程

步骤一:在SpringBoot的启动类上加上@EnableScheduling注解,开启定时任务管理。

 步骤二:编写定时任务,并在方法上添加@Scheduled来让SpringBoot识别这是一个定时任务

这样一个简单的定时任务就完成了。

@Scheduled注解的各个参数

或不多说,直接看@Scheduled注解的源码:

package org.springframework.scheduling.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";

    String cron() default "";

    String zone() default "";

    long fixedDelay() default -1L;

    String fixedDelayString() default "";

    long fixedRate() default -1L;

    String fixedRateString() default "";

    long initialDelay() default -1L;

    String initialDelayString() default "";
}

cron

该参数接收一个cron表达式,cron表达式是一个字符串,字符串与字符串之间使用空格隔开,共有七个或六个(年份可为空)域,每一个域代表不同的含义。

格式:{秒} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

有效范围可以出现的通配符是否必填
0-59的整数,  -  *  /
分钟0-59的整数,  -  *  /
小时0-23的整数,  -  *  /
日期0-31的整数,  -  *  /  ?  L  W  C
月份1-12的整数或JAN-DEc,  -  *  /
星期1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推,  -  *  /  ?  L  C
年份1970-2099年,  -  *  /

通配符说明:

,  :表示指定多个值,例如在{星期}上设置“MON,WED,FRI”表示周一,周三和周五触发。

-  :表示区间,例如在{日期}上设置 “1-3”表示1号、2号、3号都触发定时任务

*  :表示所有,例如在{小时}位置上填入*表示每个小时

/   :表示递增触发。例如在{分钟}上设计“10/15”表示从10分钟开始,每15分钟触发一次(10,25,40,55)。

?:表示不指定值,也就是可以不在乎这个位置上的值,例如:每月的一号需要进行一个操作,但不需要关心每个月的一号是星期几,所以可以这样写(0 0 0 1 * ?)

L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"。

W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-")。

# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)。

简单举几个例子:

1)0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务

2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业

3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作

4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 

5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 

6)0 0 12 ? * WED    表示每个星期三中午12点 

7)0 15 10 * * ? 20233    2023年的每天上午10:15触发 

8)0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发 

9)0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发 

当然,如果觉得麻烦,可以使用在线生成cron表达式的工具:在线Cron表达式生成器 (qqe2.com)

zone

时区,接收一个 java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。

fixedDelay

上一次执行完毕时间点之后多长时间再执行。如:

//上一次执行完毕时间点之后10秒再执行
@Scheduled(fixedDelay = 10000) 

 fixedDelayString

与 1.2.3 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如

//上一次执行完毕时间点之后10秒再执行
@Scheduled(fixedDelayString = "10000") 

占位符的使用:

在appication.yaml配置文件中添加 

time:
  fixedDelay: 10000

在代码中的使用:

/**
 * 定时任务的使用
 * @author 14236
 **/
@Component
public class Task
{
    @Scheduled(fixedDelayString = "${time.fixedDelay}")
    void testFixedDelayString()
    {
        System.out.println("欢迎访问 清木 的博客 " + System.currentTimeMillis());
    }
}

fixedRate

上一次开始执行时间点之后多长时间再执行。如:

//上一次开始执行时间点之后10秒再执行
@Scheduled(fixedRate = 10000) 

fixedRateString

与fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

 initialDelay

第一次延迟多长时间后再执行。如:

//第一次延迟5秒后执行,之后按fixedRate的规则每10秒执行一次
@Scheduled(initialDelay=5000, fixedRate=10000) 

initialDelayString

与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

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

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

相关文章

2023-08-26 LeetCode每日一题(汇总区间)

2023-08-26每日一题 一、题目编号 228. 汇总区间二、题目链接 点击跳转到题目位置 三、题目描述 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖…

五、多表查询-4.外连接

一、语法 二、演示-左外连接 【例】查询emp1表的所有数据(17条),和对应的部门信息(左外连接) 【 左外连接和内连接区别】 内连接只能查到16条数据,dept_id为null的值查不到 左外连接可以查到17条所有数据…

中文乱码处理

😀前言 中文乱码处理 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 在csdn获奖荣誉: &#x1f3c…

改进探索性数据分析的实用技巧!

Datawhale干货 译者:张峰,Datawhale成员 让 EDA 更简单(更美观)的实用指南! 原文链接:https://towardsdatascience.com/practical-tips-for-improving-exploratory-data-analysis-1c43b3484577 介绍 探索性…

fastadmin iis伪静态应用入口文件index.php

<?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"OrgPage" stopProcessing"true"><match url"^(.*)$" /><conditions…

骨传导耳机哪款比较好,几款骨传导耳机品牌推荐

相对于传统耳机&#xff0c;骨传导耳机的佩戴方式更加舒适。传统耳机需要插入耳道&#xff0c;可能会造成不适甚至痛感&#xff0c;而骨传导耳机则不需要直接接触耳朵&#xff0c;大大提高了佩戴的舒适度。并且骨传导耳机可以实现外界环境的感知。传统耳机会将耳朵与外界隔绝&a…

Java智慧工地源码:进度、质量、 成本、安全尽在掌握

智慧工地是一种崭新的工程全生命周期管理理念。智慧工地是智慧城市在建筑施工领域的延伸&#xff0c;是智慧城市的“基石”。随着工程信息化管理技术的发展&#xff0c;移动互联网、物联网、AI、大数据等新技术与施工现场业务场景深度融合&#xff0c;智慧工地已成为建筑工地信…

SpringCloud学习笔记(九)_使用Java类加载SpringBoot、SpringCloud配置文件

我们都知道平常在使用SpringBoot和SpringCloud的时候&#xff0c;如果需要加载一两个配置文件的话我们通常使用Value(“${属性名称}”)注解去加载。但是如果配置文件属性特别多的时候使用这种方式就显得特别的不友好了。 比如说&#xff0c;我们要加载下方这个名为application.…

nmon的安装与使用

一、Linux服务器配置信息 操作系统&#xff1a;CentOS 7.6 64位&#xff08;可用命令&#xff1a;cat /etc/redhat-release和uname -a查看&#xff09; CPU&#xff1a;1核&#xff08;可用命令top查看&#xff09; 内存&#xff1a;2GB&#xff08;可用命令free查看&#xff…

胖小酱之疯狂的魔术师

在外国&#xff0c;魔术&#xff0c;最早的记录出现在埃及&#xff0c;大约是在西元前2600年&#xff0c;也就是距今四千多年前。而作为具体节目表演&#xff0c;至少在两千多年前就已经出现&#xff0c;西汉元封三年&#xff0c;汉武帝举行百戏盛会&#xff0c;盛会上即有中国…

win11下MySQL8详细安装教程

文章目录 新建配置文件 my.ini初始化数据库安装服务启动服务 新建配置文件 my.ini 初始化数据库 mysqld --initialize --console记下初始密码 安装服务 mysqld --install启动服务 net start mysql修改密码请看另外文章 windows修改MySQL密码

京东自动抢茅台脚本

目前&#xff0c;在多家电商平台都可以抢购茅台酒&#xff0c;包括天猫超市、京东、天猫会员店、国美、苏宁、网易严选等渠道&#xff0c;消费者使用一台手机便可参与抢购&#xff0c;不过&#xff0c;很多消费者依旧不清楚用手机抢茅台怎么抢&#xff0c;因为抢购的人实在太多…

算法通关村十三关 | 数组字符串加法专题

1. 数组实现整数加法 题目&#xff1a;LeetCode66&#xff0c;66. 加一 - 力扣&#xff08;LeetCode&#xff09; 思路 我们只需要从头到尾依次运算&#xff0c;用常量标记是否进位&#xff0c;需要考虑的特殊情况是digits [9,9,9]的时候进位&#xff0c;我们组要创建长度加1…

JCTools Mpsc源码详解(二) MpscArrayQueue

MpscArrayQueue是一个固定大小的环形数组队列,继承自ConcurrentCircularArrayQueue MpscArrayQueue的特点: 环形队列底层数据结构为数组有界 看一下MpscArrayQueue的属性(填充类除外)--- //生产者索引 private volatile long producerIndex; //生产者边界 private volatile…

NSSCTF——Web题目1

目录 一、[LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; 二、[LitCTF 2023]Ping 三、[SWPUCTF 2021 新生赛]easyupload1.0 四、[SWPUCTF 2021 新生赛]easyupload2.0 五、[SWPUCTF 2021 新生赛]caidao 一、[LitCTF 2023]PHP是世界上最好的语言&#xff01;&a…

QA3

1. file_name.split(.)[0] 这是什么意思&#xff1f; 这行代码是将文件名按照点&#xff08;.&#xff09;进行分割&#xff0c;并返回分割后的列表中的第一个元素。在许多编程语言中&#xff0c;点通常用作文件名和扩展名之间的分隔符。通过使用split(.)函数&#xff0c;我们…

什么是 API ?

一、API 的定义&#xff1a;数据共享模式定义 4 大种类 作为互联网从业人员&#xff0c;API 这个词我耳朵都听起茧子了&#xff0c;那么 API 究竟是什么呢&#xff1f; API 即应用程序接口&#xff08;API&#xff1a;Application Program Interface&#xff09;&#xff0c;…

AI 绘画Stable Diffusion 研究(十六)SD Hypernetwork详解

大家好&#xff0c;我是风雨无阻。 本期内容&#xff1a; 什么是 Hypernetwork&#xff1f;Hypernetwork 与其他模型的区别&#xff1f;Hypernetwork 原理Hypernetwork 如何下载安装&#xff1f;Hypernetwork 如何使用&#xff1f; 在上一篇文章中&#xff0c;我们详细介绍了 …

如何开发小程序 3 个月赚 6.18 元

前言 随着 Ai 的崛起&#xff0c;开发者的就业也越来越困难&#xff0c;好像疫情放开后整个世界都变了&#xff0c;全球都在经历经济下行的压力。那么作为个人开发者如何在工作之余获取额外收入呢&#xff1f;笔者也是个一般开发者&#xff0c;没有牛逼的技术实力&#xff0c;…

rust交叉编译 在mac下编译linux和windows

系统版本macbook proVentura 13.5linux ubuntu22.04.3 LTS/18.04.6 LTSwindowswindows 10 专业版 20H2mac下rustc --versionrustc 1.74.0-nightly (58eefc33a 2023-08-24)查看当前系统支持的交叉编译指定系统版本列表 rustup target list如果已经安装这里会显示(installed)。…