Java【付诸实践 03】Spring定时任务注解@Scheduled+@EnableAsync用法详解


Demo实现的是项目启动3s后每秒输出当前时间,日志是诚实的…



2021-06-24 15:18:06.798 INFO 16108 — [)-192.168.0.108] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
2021-06-24 15:18:09.559
2021-06-24 15:18:10.559
2021-06-24 15:18:11.558
2021-06-24 15:18:12.558
2021-06-24 15:18:13.558
2021-06-24 15:18:14.558
2021-06-24 15:18:15.558


### 2.@Scheduled用法



// 先看看源码 spring版本 5.2.3.RELEASE
@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 “”;
}


**注解说明:**


* @Target({ElementType.METHOD, ElementType.ANNOTATION\_TYPE}):表示@Schduled可以被使用在方法和注解上。
* @Retention(RetentionPolicy.RUNTIME):表示@Schduled的生命周期是在程序运行时。
* @Repeatable(Schedules.class):表示@Schduled可以被在同一个地方重复使用多次,参数存放在Schedules类中(我们可以点进去看Schedules类,发现里面有一个Scheduled数组对象,用来保存多个Scheduled的配置)。


**属性说明:**


* String CRON\_DISABLED:定时禁用标志。
* String cron():定义定时执行时间,默认值为空字符串,表示该值无效。
* String zone():定义时区,默认值为空字符串。
* long fixedDelay():定义任务下次开始执行的间隔时间,从上一次任务执行完成开始计算,单位毫秒。默认值-1L,表示该值设置无效。
* String fixedDelayString():定义任务下次开始执行的间隔时间,从上一次任务执行完成开始计算,单位毫秒。与fixedDelay不同只在于值的格式。默认值"",表示该值设置无效。
* long fixedRate():定义每两次任务的间隔频率,从上一次任务开始执行开始计算,单位毫秒。默认值-1L,表示该值无效。
* String fixedRateString():定义每两次任务的间隔频率,从上一次任务开始执行开始计算,单位毫秒。与fixedRate不同只在于值的格式。默认值为空字符串,表示该值无效。
* long initialDelay():定义第一次执行的延迟执行时间,单位秒。默认值-1L,表示没有延迟。
* String initialDelayString():定义第一次执行的延迟执行时间,与initialDelayDelay()不同在于这里使用表达式,而不是以秒为单位。默认值为空字符串,表示没有延迟。


**特别注意:**


我们要区分fixedDelay和fixedRate的不同,前者是当前方法执行完毕后加上间隔时间再去执行方法,后者不管任务是否执行完毕间隔时间一到就会再次执行方法。


### 3.cron


前面的demo实现的是简单的延时和频率执行。使用cron可以实现定时定频执行。这里的cron跟Linux上的cron是不同的,Linux上的表达式没有秒,大家要注意。


cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,由于年份非必填所以cron有如下两种语法格式:


1. Seconds Minutes Hours DayofMonth Month DayofWeek Year
2. Seconds Minutes Hours DayofMonth Month DayofWeek


每一个域可出现的字符如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210624180156611.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE2ODU0MQ==,size_16,color_FFFFFF,t_70#pic_center)


**含义:**


* \*:表示匹配该域的任意值,假如在Minutes域使用\*, 即表示每分钟都会触发事件。
* ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 \* ?, 其中最后一位只能用?,而不能使用\*,如果使用\*表示不管星期几都会触发,实际上并不是这样。
* -:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。
* /:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次。
* ,:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
* L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
* W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。
* LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
* #:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。


**举几个例子【这里是举一反三的环节】** 😃




### 最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

![都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”](https://img-blog.csdnimg.cn/img_convert/0e3cd24b21bc5fbe6f637da3ef68e5ac.webp?x-oss-process=image/format,png)



以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

[外链图片转存中...(img-rvhy4nYP-1714332386719)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值