[转]@Scheduled cron表达式

原文地址:https://www.cnblogs.com/dyppp/p/7498457.html

一、Cron详解:

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

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

每一个域可出现的字符如下: 
Seconds: 可出现", - * /"四个字符,有效范围为0-59的整数 
Minutes: 可出现", - * /"四个字符,有效范围为0-59的整数 
Hours: 可出现", - * /"四个字符,有效范围为0-23的整数 
DayofMonth :可出现", - * / ? L W C"八个字符,有效范围为0-31的整数 
Month: 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc 
DayofWeek: 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推 
Year: 可出现", - * /"四个字符,有效范围为1970-2099年

 

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是: 
(1) *:表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。

(2) ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。 

(3) -:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 

(4) /:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次. 

(5) ,:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。 

(6) L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。

(7) W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。

(8) LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 

(9) #:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。 

 

举几个例子: 

每隔5秒执行一次:"*/5 * * * * ?"

每隔1分钟执行一次:"0 */1 * * * ?"

每天23点执行一次:"0 0 23 * * ?"

每天凌晨1点执行一次:"0 0 1 * * ?"

每月1号凌晨1点执行一次:"0 0 1 1 * ?"

每月最后一天23点执行一次:"0 0 23 L * ?"

每周星期天凌晨1点实行一次:"0 0 1 ? * L"

在26分、29分、33分执行一次:"0 26,29,33 * * * ?"

每天的0点、13点、18点、21点都执行一次:"0 0 0,13,18,21 * * ?"

表示在每月的1日的凌晨2点调度任务:"0 0 2 1 * ? *"

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

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

 

注意:由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?

二、启动服务时执行任务

通过@Scheduled cron可以执行定时任务,而想要在服务启动时就先执行一次代码

可以通过 implements InitializingBean 重写 afterPropertiesSet 方法来调用一遍定时任务的方法来达到启动服务时执行一遍工作的效果

 

public class FuncReportScheduled implements InitializingBean{

    /**
     * 每月月初执行一次
     */
    @Scheduled(cron="0 0 0 1 * ?")
    @Transactional
    public void funcReportInit(){
        log.info("---------------- 定时任务 ----------------");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        this.funcReportInit();
    }
}

 

### 回答1: cron表达式是一种定时计划的格式,用于指定在特定时间执行特定任务。它由六个域组成,分别表示分钟、小时、日期、月份、星期和命令。每个域都可以使用数字、通配符或列表来描述。例如,"0 0 * * *"表示每天的零时零分执行任务。 ### 回答2: @scheduled cron表达式是一种在Spring Boot项目中使用的定时器表达式,用于定时运行某段代码。cron表达式是一种字符串,它包含6个字段,分别表示秒、分、时、日、月和周的执行时间。cron表达式被广泛用于计划任务的管理和执行,支持非常灵活的定时任务配置。 cron表达式的语法非常灵活,其中每个字段都允许多个数值、范围和通配符。例如,秒和分都可以使用0~59之间的数字,而小时字段可以使用0~23之间的数字。日和月字段都支持数字、英文缩写和“/”符号。星期字段支持数字、英文缩写、“/”符号和“L”标记。还可以使用特定的字符表示每隔一定周期执行一次,如“*”表示每个时段都执行,而“?”则表示不指定该字段。 在Spring Boot项目中使用@scheduled注解来指定cron表达式,用于描述要定时执行的方法。通过这种方式,开发者可以很容易地维护和管理定时任务。通常,要执行的方法放置在自定义的Service或Component中,并使用注解来配置cron表达式。 总之,@scheduled cron表达式是一种强大、灵活和可靠的定时任务管理方式,可以在Spring Boot项目中轻松应用。它可以在指定的时间点自动运行任务,从而节省时间和精力,提高开发效率。开发者可以根据自己的需求和业务场景来灵活配置和使用cron表达式,从而实现更好的定时任务管理。 ### 回答3: @scheduled是Spring框架中的注解,用于定时任务的调度。cron表达式则是用来定义调度规则的字符串,可以设置任务何时执行。 cron表达式有以下五个部分,分别代表任务执行的时间点: 1. 秒(0-59) 2. 分(0-59) 3. 时(0-23) 4. 日(1-31) 5. 月(1-12)或简写(JAN-DEC) 6. 周几(1-7)或简写(SUN-SAT) 有些情况下,月份和星期几不能同时出现在一个cron表达式中。可以使用问号(?)代替其中一个部分,表示不关心其值。 cron表达式的格式举例: * * * * * * 表示每秒执行一次任务 0 0 0 * * * 表示每天凌晨执行一次任务 0 30 9 * * * 表示每天上午9:30执行一次任务 0 0/5 * * * * 表示每5分钟执行一次任务 0 0 12 ? * WED 表示每周三中午12点执行一次任务 0 0 12 * * ? 表示每天中午12点执行一次任务 @Scheduled注解可以用来指定方法在何时执行。它有以下属性: 1. cron:用来指定cron表达式 2. fixedDelay:用来指定任务的执行间隔时间,单位是毫秒 3. fixedRate:用来指定任务的执行周期,单位是毫秒 4. initialDelay:用于指定任务的首次执行延迟时间,单位是毫秒 通过配置@Scheduled注解和cron表达式,我们可以定时执行各种任务,包括数据清理、日志备份、邮件发送等。这可以显著减少手动操作的工作量,提高应用程序的自动化和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值