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

@Scheduled定时器

@Scheduled定时器

  • 一、基本使用
  • 二、参数说明
    • fixedDelay
    • fixedRate
    • initialDelay
    • cron
  • 三、cron 表达式
    • 参数说明
    • 实用性的案例
  • 四、@Scheduled注意事项
  • 五、配置文件
    • 1、fixedDelay
    • 2、fixedRate
    • 3、cron

一、基本使用

@Scheduled  // 由Spring定义,用于将方法设置为调度任务。如:定时执行一次或定时轮询执行一段代码。该注解放到需要定时执行的方式上@EnableScheduling  // 再项目启动类上添加注解@EnableScheduling,表示开启定时任务
@Scheduled(fixedDelay=20*1000)   //每隔20秒执行
public void scheduledTaskByFixedDelay() {log.info("定时任务开始 ByFixedDelay:" + DateUtils.getDatetimeString());String str = "Hello,,,World,,,每20秒,,,指定参数FixedDelay,,,";List<Map<String,String>> list = helloService.getTemp();log.info(str+ JSON.toJSONString(list));log.info("定时任务结束 ByFixedDelay:" + DateUtils.getDatetimeString());
}
@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

二、参数说明

fixedDelay

上一次任务执行完毕时间点之后多长时间再执行,任务的执行要等上一个任务执行结束。
它的间隔时间是根据上次的任务结束的时候开始计时的。
比如一个方法上设置了 fixedDelay=10*1000,那么当该方法某一次执行结束后,开始计算时间,当时间达到10秒,就开始再次执行该方法。

@Scheduled(fixedDelay=10000)   //每隔10秒执行@Scheduled(fixedDelay=60*60*1000)   //每隔1小时执行

fixedRate

上一次任务开始执行点之后指定时间后再执行(如果执行时间超过了间隔时间,那上一次任务执行完之后,立即执行下一个任务)
fixedRate 理解起来比较麻烦,它的间隔时间是根据上次任务开始的时候计时的。比如当方法上设置了 fiexdRate=5000,该执行该方法所花的时间是2秒,那么3秒后就会再次执行该方法。
但是这里有个坑,当任务执行时长超过设置的间隔时长,那会是什么结果呢。打个比方,比如一个任务本来只需要花2秒就能执行完成,我所设置的fixedRate=5000,但是因为网络问题导致这个任务花了7秒才执行完成。当任务开始时Spring就会给这个任务计时,5秒钟时候Spring就会再次调用这个任务,可是发现原来的任务还在执行,这个时候第二个任务就阻塞了(这里只考虑单线程的情况下,多线程后面再讲),甚至如果第一个任务花费的时间过长,还可能会使第三第四个任务被阻塞。被阻塞的任务就像排队的人一样,一旦前一个任务没了,它就立马执行。

@Scheduled(fixedRate=60000)   //任务开始执行后隔60秒执行@Scheduled(fixedRate=60*60*1000)   //任务开始执行后隔1小时执行

initialDelay

第一次任务将会延迟指定时间后启动

@Scheduled(fixedDelay=60*60*1000,initialDelay=60*1000)   //第一次任务延迟1分钟启动,之后每隔1小时执行

cron

该参数接受一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义。

@Scheduled(cron="秒 分 时 日 月 周 年")   // 年不是必需的,可省略

三、cron 表达式

@Scheduled(cron="秒 分 时 日 月 周 年")   // 年不是必需的,可省略

参数说明

其中,每个时间字段都有对应的取值范围和特殊符号。下面是每个时间字段的详细说明:

1、秒 (Seconds):取值范围为 0~59。例如,'0/5'表示每隔5秒触发一次。'*'表示每秒种都触发。允许使用特殊字符 , - * /2、分钟 (Minutes):取值范围为 0~59。例如,'0/5'表示每隔5分钟触发一次。'*'表示每分种都触发。允许使用特殊字符 , - * /3、小时 (Hours):取值范围为 0~23。例如,'0/2'表示每隔2小时触发一次。'*'表示每小时都触发。允许使用特殊字符 , - * /4、日期 (Day of Month):取值范围为 1~31。例如,'1,15'表示每月的1日和15日触发,'*'表示每天都触发。允许使用特殊字符 , - * ? / L W C5、月份(Month):取值范围为 1~12,也可以使用英文缩写JANFEBMAR等。例如,'1,6'表示一月和六月触发,'*'表示每个月都触发。允许使用特殊字符 , - * /6、星期 (Day of Week) :取值范围为 1~71 表示星期日,2 表示星期一,以此类推,也可以使用英文缩写 SUNMONTUE 等。例如,'2-6'表示星期一到星期五触发,'*' 表示每个星期都触发。允许使用特殊字符 , - * ? / L C #7、年份 (Year):可选字段,表示触发条件的年份。例如,'2023' 表示在2023年触发,'*' 表示每年都触发。允许使用特殊字符 , - * /// 在使用时,由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?

除了取值范围,Cron 表达式还支持一些特殊符号,用于指定特定的触发条件,例如:

星号(*):代表所有可能的取值,表示不限制该时间字段的取值范围。
问号(?):仅在日期和星期字段中使用,表示不指定具体的取值,可以任意匹配。
斜线(/):表示间隔触发,例如在分钟字段中,"*/5"表示每隔5分钟触发一次。"0/15"表示从第0分钟开始,每15分钟。"3/20"表示从第3分钟开始,每20分钟(它和"3,23,43")的含义一样
逗号(,):用于指定多个取值,例如在小时字段中,"1,3,5" 表示在第 135 小时触发。
减号(-):用于指定一个范围,例如在月份字段中,"3-6" 表示三月到六月触发。"L" 字符仅被用于天(月)和天(星期)两个子表达式,它是单词"last"的缩写
如果在"L"前有具体的内容,它就具有其他的含义了。例如:"6L"表示这个月的倒数第6天
注意:在使用"L"参数时,不要指定列表或范围,因为这会导致问题
"W" 字符代表着工作日(Mon-Fri),并且仅能用于日历中。它用来指定离指定日的最近的一个星期日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。
例如,日域中的 15W 意味着 "离该月15号的最近一个工作日"。 假如15号是星期六,那么 trigger 会在14(星期五)触发,因为星期伍比星期一离15号更近。
"C" 字符代表"Calendar"的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

实用性的案例

"0 0 10,14,16 * * ?"  每天上午10,14,16"0 0/30 9-17 * * ?"   朝九晚五工作时间内每半小时
"0 0 12 ? * WED" 表示每个星期三中午12"0 0 12 * * ?"   每天中午12点触发 
每天上午10:15触发: "0 15 10 ? * *"   "0 15 10 * * ?"   "0 15 10 * * ? *"
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
"0 * 14 * * ?"       在每天下午2点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?"     在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?"  在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?"     在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:102:44触发 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
"0 15 10 15 * ?" 每月15日上午10:15触发 
"0 15 10 L * ?"  每月最后一日的上午10:15触发 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 @Scheduled(cron = "*/5 * * * * ?")  \\每隔5秒钟执行一次@Scheduled(cron = "0 */1 * * * ?")  \\每隔一分钟执行一次@Scheduled(cron = "0 26,29,33 * * * ?")  \\在各个小时的26分、29分、33分执行一次@Scheduled(cron = "0 0 */2 * * ?")  \\每隔两小时执行一次@Scheduled(cron = "0 0 1 * * ?")  \\每天凌晨1点执行一次@Scheduled(cron = "0 0 6,15,20 * * ?")  \\每天的6点、15点、20点触发定时任务@Scheduled(cron = "0 0 2 1 * ?")  \\每月1号凌晨2点执行一次@Scheduled(cron = "0 0 23 L * ?")  \\每月最后一天23点执行一次@Scheduled(cron = "0 0 3 ? * L")  \\每周星期六凌晨3点执行一次@Scheduled(cron = "0 0 12 ? * SUN")  \\每周星期天中午12点执行一次@Scheduled(cron = "0 0 0 L * ?")  \\每个月的最后一天执行一次@Scheduled(cron = "0 0/5 9-17 * * MON-FRI")  \\工作日的早上 9 点到下午 5 点,每隔 5 分钟触发定时任务

Scheduled(cron=“0 */1 * * * ?”)
每一分钟执行一次。比如第一次执行时间为2023-10-20 23:08:12,下一次2023-10-20 23:09:12,再下一次2023-10-20 23:10:12

@Scheduled(cron = “10 * * * * ?”)
每分钟的第十秒执行一次。比如第一次执行时间为2023-10-20 23:09:10,下一次2023-10-20 23:10:10,再下一次2023-10-20 23:11:10。 之所以用(23:09:10)举例,是因为上一个任务是在(23:08:12)才启动,所以任务只能从23:09:10开始

@Scheduled(cron = “*/10 * * * * ?”)
每十秒钟执行一次。比如第一次执行时间为2023-10-20 23:08:12,下一次2023-10-20 23:08:22,再下一次2023-10-20 23:08:32

四、@Scheduled注意事项

  • spring的注解@Scheduled 需要写在实现方法上
  • 定时器的任务方法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定一个proxytargetclass的某个值为true),不能指向任何的参数
  • 如果该方法需要与应用程序上下文的其他对象进行交互,通常是通过依赖注入来实现
  • 实现类上要有组件的注解@Component

五、配置文件

1、fixedDelay

@Scheduled(initialDelay = 5, fixedDelayString = "${erwin.fixed-delay:2}", timeUnit = TimeUnit.SECONDS)
public void scheduledTaskByFixedDelay() {log.info("定时任务开始 ByFixedDelay:" + DateUtils.getDatetimeString());log.info("Hello,,,World,,,指定参数fixedDelay,,,");
}

配置文件 .yml

erwin:fixed-delay: 5

如果在配置文件中没有配置,则每隔2秒执行一次,如果配置了,就每隔5秒执行一次。initialDelay 表示,项目启动后,5秒开始执行第一次任务。
注意:${erwin.fixed-delay:2},冒号前后不能有空格。

2、fixedRate

@Scheduled(initialDelay = 5, fixedRateString = "${erwin.fixed-rate:2}", timeUnit = TimeUnit.SECONDS)
public void scheduledTaskByFixedRate() {log.info("定时任务开始 ByFixedRate:" + DateUtils.getDatetimeString());log.info("Hello,,,World,,,指定参数fixedRate,,,");
}

配置文件 .yml

erwin:fixed-rate: 5

3、cron

如果配置文件没有配,就会使用默认的值。

@Scheduled(cron = "${erwin.cron:0/10 * * * * ?}")
public void scheduledTaskByCron() {log.info("定时任务开始 ByCron:" + DateUtils.getDatetimeString());log.info("Hello,,,World,,,指定参数cron,,,");
}

配置文件 .yml

erwin:cron: 0/30 * * * * ?

相关文章:

@Scheduled定时器

Scheduled定时器 一、基本使用二、参数说明fixedDelayfixedRateinitialDelaycron 三、cron 表达式参数说明实用性的案例 四、Scheduled注意事项五、配置文件1、fixedDelay2、fixedRate3、cron 一、基本使用 Scheduled // 由Spring定义&#xff0c;用于将方法设置为调度任务。…...

Xshell+screen解决ssh连接 服务器掉线的问题

Linux screen命令解决SSH远程服务器训练代码断开连接后运行中断_linux screen ssh-CSDN博客 Linux命令之screen命令_linux screen_恒悦sunsite的博客-CSDN博客 使用教程&#xff1a; 这里粗略介绍一下 &#xff08;1&#xff09;xshell xftp&#xff08;xshell点这个&#…...

coding_v3

面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 数组/字符串 1.LC88【合并两个有序数组】 def solve(nums1, m, nums2, n):p1, p2 m-1, n-1tail m n -1while p1 > 0 or p2 > 0:if p1 -1:nums1[tail] nums2[p2]p2…...

Elasticsearch:什么是余弦相似度?

余弦相似度是数据科学、文本分析和机器学习领域的基本概念。 如果你想知道什么是余弦相似度或者它如何在现实世界的应用程序中使用&#xff0c;那么你来对地方了。 本指南旨在让你深入了解相似性是什么、其数学基础、优点及其在不同领域的各种应用。读完本指南后&#xff0c;你…...

【每日一题Day352】LC1726同积元组 | 哈希表+排列组合

同积元组【LC1726】 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b ! c ! d 。 思路 求出所有二元组的积及其出现次数&#xff0c;假设某个积出现的次…...

react中在js文件里定义的变量,如何在less文件里去使用该变量

在 React 中&#xff0c;如果在 JS 文件中定义了变量&#xff0c;可以使用 CSS Modules 的方式将变量导出到 LESS 文件中。 以下是示例代码&#xff1a; // index.js import React from react; import styles from ./styles.module.less;const color red;function App() {re…...

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例 例如: 我们想判断某个字节中各个位的状态是1还是0 ,如何实现呢? 这里介绍通过SCATTER指令拆分字节的方法,仅供大家参考。 首先,我们先了解以下SCATTER指令的基本功能和使用方法: 如下图所示,在基本指…...

网络协议--ARP:地址解析协议

4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制&#xff08;常常为48 bit地址&#xff09;&#xff0c;这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…...

pdf导出实例(itestpdf)

依赖 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency>工具类 package or…...

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接&#xff1a;武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链&#xff1a; • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…...

memcpy内存拷贝函数

目录 一、memcpy内存拷贝函数 注意事项 二、memcpy与strcpy对比 三、模拟实现memcpy函数 四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝 五、改进my_memcpy函数 一、memcpy内存拷贝函数 头文件&#xff1a;string.h 函数原型&#xff1a;void* memcpy(void* …...

数组模拟堆

文章目录 QuestionIdeasCode Question 维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x &#xff1b; PM&#xff0c;输出当前集合中的最小值&#xff1b; DM&#xff0c;删除当前集合中的最小值&#xff08;数…...

【深度学习基础知识(一):卷积神经网络CNN基础知识】

深度学习基础知识 深度学习基础知识&#xff08;一&#xff09;&#xff1a;卷积神经网络CNN基础知识 卷积神经网络CNN基础知识 0、目录 1. CNN卷积神经网络的特点 2. 卷积操作基础知识 2.1 卷积操作的概念2.2 卷积操作的种类2.3 卷积操作后特征图谱大小计算公式 3. 池化操…...

Git使用入门

一、Git简介 Git 是一个开源的分布式版本控制系统。 Git版本控制的功能为保存不同版本的代码&#xff0c;保存代码的地方叫做仓库。 每个仓库中有多个分支&#xff0c;每个分支上又有很多节点&#xff0c;每个节点代表一个版本&#xff0c;不同的分支可以进行合并&#xff0…...

电机矢量控制算法和例程

电机矢量控制算法是一种高级的电机控制方法&#xff0c;它通过将电机转子空间矢量转换到旋转坐标系中&#xff0c;并在该坐标系中进行控制来实现对电机的精确控制。下面是对电机矢量控制算法的详细解释&#xff1a; 坐标系变换&#xff1a;电机矢量控制首先将电机转子空间矢量变…...

std::string_view概念原理及应用

概念 使用const string&作为参数是先使用字符串字面量编译器会创建一个临时字符串对象然后创建std::string。 或者一个函数提供char*和const string&参数的两个版本函数&#xff0c;不是优雅的解决方案。 于是需要一个只使用内存不维护内存的类。 原理 在visual s…...

lodash库_.chunk、_.pick、_.omit、_.cloneDeep、_.debounce方法

lodash 模块化、高性能的 JavaScript 实用工具库。官方文档&#xff1a;https://www.lodashjs.com 1.对数组进行分组 _.chunk(array, [size1]) 使用场景&#xff0c;如移动端页面一行能放5个元素&#xff0c;总共7条数据&#xff0c;将一维数组转为二维数组&#xff0c;让一个…...

Java使用FFmpeg对视频文件打标记

免安装 FFmpeg <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.0.1</version><exclusions><!-- 排除windows 32位系统 --><exclusion><groupId>ws.sch…...

Redux 学习笔记

在使用 React Redux 前&#xff0c;我们首先了解一下 Redux 的一些基础知识。 Redux 是 JavaScript 应用程序中用于状态管理的容器。它不依赖于任何框架&#xff0c;可以与任何 UI 库和框架一起使用。在应用程序中使用 Redux 时&#xff0c;Redux 是以可预测的方式管理状态。 …...

【Bug】8086汇编学习

文章目录 随笔Bug1、masm编译报错&#xff1a;Illegal use of register2、debug中使用段前缀3、[idata]在编译器中的处理4、push立即数报错5、报错&#xff1a;improper operand type6、程序莫名跳转到未知位置 (doing)7、DOSBox失去响应8、程序运行显示乱码9、程序运行导致DOS…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...