专栏首页北风IT之路实现定时任务——Cron表达式

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

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

@EnableScheduling

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

例如:

/**
 * @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());
    }
}

测试结果

函数被触发了,时间: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表达式。

本文分享自微信公众号 - 北风IT之路(beifengtz),作者:beifengtz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 详谈Java中的CAS操作

    我们知道,在高并发的环境下如果要操作一个数,保证数据的正确性是我们首要关心的,要达到这个目的就需要满足操作的原子性、有序性、可见性,相信很多人看到这三个特点首先...

    beifengtz
  • Java8新特性学习--函数式编程

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。

    beifengtz
  • 数据库之索引总结

    索引在数据库中可以说是相当重要的一块知识点了,也是面试经常被问的,这篇文章就总结一下索引相关的知识点,包括索引的底层实现原理,索引的分类,最左匹配原则等。

    beifengtz
  • iCDO一周数据:Facebook:要让对的人看到对的广告;互联网平均年薪超20万

    10 月31日早间消息,Facebook发布了截至9月30日的2018财年第三季度未经审计财报。报告显示,Facebook第三季度营收为137.27亿美元,比去...

    iCDO互联网数据官
  • web防火墙和waf防火墙的区别和选择

    首先说下被很多老鸟或小白混要的一些说法,web防火墙和waf防火墙不属于一个东西.真的,看我解释.

    用户2436573
  • 自然语言处理期刊

    国内自然语言处理期刊 现代语言学(汉斯出版社) 汉斯出版社(Hans Publishers, www.hanspub.org) 聚焦于国际开源 (Open A...

    致Great
  • php之laravel学习常见错误3(连载中)

    下面是我们整理的php的laravel学习的常见的错误以及解决的办法,我还会持续更新,请关注

    一个淡定的打工菜鸟
  • 与程序员打交道,千万别“嘴欠”说这 11 句话

    身为一名非开发人员,如果想要与自己的开发团队建立良好的沟通关系,那么就需要知道哪些东西是开发人员喜欢听的,而哪些是开发人员不喜欢听的。例如,开发人员喜欢听到你在...

    奋斗蒙
  • .NET中的异步编程上

    开篇 异步编程是程序设计的重点也是难点,还记得在刚开始接触.net的时候,看的是一本c#的Winform实例教程,上面大部分都是教我们如何使用Winform的控...

    逸鹏
  • 前端与后端开发中技术差异的全面对比[每日前端夜话0x9B]

    如果你是一位有志于全面了解前后端编程语言及框架的开发人员或创业者,那你来对地方了。本文将帮助你了解前端和后端技术之间的基本差异。

    疯狂的技术宅

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动