前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现定时任务——Cron表达式

实现定时任务——Cron表达式

作者头像
beifengtz
修改2019-06-05 16:41:39
5.4K0
修改2019-06-05 16:41:39
举报
文章被收录于专栏:北风IT之路北风IT之路

1. 引言

在web开发过程中,经常我们会有这样的需求:定时对数据库进行数据更新、设置任务提醒等等。要实现这样的定时任务,就需要使用listener做定时器,原生实现之前有玩过,过程比较复杂(感兴趣的下伙伴可以去学习一下),自从用了Spring框架之后有更方便的实现,那就是Cron表达式,今天就简单介绍一下Cron表达式在Springboot中的使用方法和它的基本语法。

2. Cron结构

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

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

3. Cron字段符号

3.1 字段含义

3.2 符号含义

  1. * 表示匹配该域的所有值。在分钟里表示每一分钟触发。在小时,日期,月份等里面表示每一小时,每一日,每一月。
  2. 只能用在DayofMonth和DayofWeek两个域。表示不指定值。表示不关心当前位置设置的值。 比如不关心是周几,则周的位置填写?
  3. - 表示范围。例如小时设置为10-12表示10,11,12点均会触发。
  4. , 表示多个值。例如小时设置11,12表示11和12点均会触发。
  5. / 表示递增触发。例如在秒处设置5/20表示的是从5秒开始每隔20秒触发一次。
  6. L 表示最后,只能出现在DayofWeek和DayofMonth域。例如在星期里设置5L表示的是最后的一个星期四触发(注:一周是以星期天为第一天),如果直接设置为L,表示最后一周的最后一天触发。
  7. W 表示离指定日期最近的工作日(周一到周五)触发,只能出现在DayofMonth域。例如13W表示的是离13号最近的一个工作日触发
  8. # 表示的是每个月的第几个星期几,只能出现在DayofMonth域。例如4#2表示的是某月的第二个星期三(4表示星期三,一周从周天开始计算)

4. 常用Cron表达式

  • 0/1 * * * * ? 每秒触发一次
  • 1-2 * * * * ? * 每个小时的第1、2秒触发
  • 0 0 12 * * ? 每天中午12点触发
  • 0 15 10 ? * * 每天上午10:15触发
  • 0 15 10 * * ? 2018 2018年的每天上午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 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
  • 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
  • 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
  • 0 15 10 ? * 6L 2018-2020 2018年至2020年的每月的最后一个星期五上午10:15触发
  • 0 4 1 1 * 1月1日早上4点触发

这里记录一个在线生成Cron表达式的网站http://cron.qqe2.com/

5. Springboot中使用Cron表达式

首先需要在启动类出加一个注解,允许解析Cron

代码语言:javascript
复制
@EnableScheduling

然后我们只需要在需要定期执行的方法上加上@Scheduled直接就可以了

例如:

代码语言:javascript
复制
/**
 * @Author beifengtz
 * @Site www.beifengtz.com
 * @Date Created in 23:31 2018/12/10
 * @Description:
 */
@Component
public class CronTest {

    /**
     * 打印测试
     * 每隔一秒触发一次
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    public void testPrint(){
        System.out.println("函数被触发了,时间:"+new Date().toString());
    }
}

测试结果

代码语言:javascript
复制
函数被触发了,时间:Tue Dec 11 00:23:15 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:16 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:17 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:18 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:19 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:20 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:21 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:22 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:23 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:24 CST 2018
函数被触发了,时间:Tue Dec 11 00:23:25 CST 2018

如果应用到实际项目中,比如定期更新数据、用户定时任务、定期清理垃圾文件等等都可以用到Cron表达式。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北风IT之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
  • 2. Cron结构
  • 3. Cron字段符号
    • 3.1 字段含义
      • 3.2 符号含义
      • 4. 常用Cron表达式
      • 5. Springboot中使用Cron表达式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档