Java 定时任务之最简单的实现

本文是通过 @Scheduled 和 @EnableScheduling 配合使用完成定时任务。
将@EnableScheduling放在项目主启动类类名上方,
将@Scheduled注解放在待定时的方法名上方,并设置 cron 参数即可。

直接上案例:
启动类

package com.gump;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling//开启定时任务
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

定时任务类

package com.gump.job;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * 最简单的定时任务
 */
@Component
public class ScheduledTask {
    @Scheduled(cron = "*/10 * * * * ?")
//    @Scheduled(fixedDelay = 10000)
//    @Scheduled(fixedRate = 10000)
    public void startTask(){
        System.out.println("每隔10秒执行一次:" + new Date());
    }
}

@EnableScheduling 的作用

见名之意,可简单理解为:开启了定时任务,会去扫描含有 @Scheduled 注解的方法,并按频率执行。

@Scheduled 的作用

标注方法为定时任务方法,并为方法配置执行频率(必须指定 cron,fixedDelay或fixedRate属性之一)。

@Scheduled注解参数如下:

参数说明示例
cron任务执行的cron表达式,可以灵活配置任务的执行频率。@Scheduled(cron = “*/10 * * * * ?”)
zonecron表达时解析使用的时区,默认为服务器的本地时区。使用java.util.TimeZone#getTimeZone(String)方法解析。GMT-8:00
fixedDelay固定延迟:上一次任务执行结束到下一次执行开始的间隔时间固定,单位为ms。@Scheduled(fixedDelay = 10000)
fixedDelayString与fixedDelay一致,只是间隔时间使用java.time.Duration#parse解析。
fixedRate固定速率:上一次任务执行开始到下一次执行开始的间隔时间固定,单位为ms。若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后,马上执行下一次任务。@Scheduled(fixedRate = 10000)
fixedRateString与fixedRate一致,只是间隔时间使用java.time.Duration#parse解析。
initialDelay首次延迟多长时间后执行,单位ms。之后按照fixedRate、fixedRateString、fixedDelay、fixedDelayString指定的规则执行,需要指定其中一个规则。注意:不能和cron一起使用。
initialDelayString与initialDelay 一致,只是间隔时间使用java.time.Duration#parse解析。

一般我们使用 cron 进行配置,因此需要掌握 cron 的使用。

cron 表达式详解

cron 表达式从左到右用空格隔开分别是:【秒 分 时 日 月 周 年(可省略)】

时间域取值范围通配符
0~59, - * /
0~59, - * /
0~23, - * /
1~31, - * ? / L W C
1-12 或 JAN-DEC, - * /
0-6 或 SUN-SAT
1-6对应周一到周六,0对应星期天
, - * ? / L C #
年(非必填), - * /

cron 表达式中的符号说明:

符号说明
数字数值,出现在对应的时间域表示对应的时间。例如:cron = “6 5 4 3 2 ?” 中,6指6秒,5指5分,4指4点,3指3号,2指2月。
*(通配符)匹配任意值,例如* * * * * ?表示每秒执行一次任务。
?(无意义占位符)忽略,语义相当于不管… 比如第六个位置的?就表示不管当前是周几就会执行。为了避免日和周的时间冲突,日和周其中一个需配置为 ? 。
/(步长)间隔,语义相当于每隔…
例如第三个时间域(时)的 2/5表示从2点开始每隔5小时。
-(范围)区间,用于指定一个范围内的取值,例如0 0 9-17 * * MON-FRI表示周一至周五的9点到17点之间每小时执行一次任务。
,(列表)枚举,用于指定多个取值,例如0 0 6,12,18 * * ?表示每天6点、12点和18点执行任务。
L(Last)表示某个指定时间内的最后一天,比如0 0 L * * ?表示每月的最后一天执行任务。
W(Weekday)表示距离指定日期最近的工作日,比如0 0 0 15W * ?表示当月第15个工作日执行任务。如果15号是工作日,则执行任务;如果15号是周末,则任务会提前到最近的工作日即14号执行。
C(Calendar)表示距离指定日期最近的那个日子,比如0 0 0 1C * ?表示当月的第一个工作日执行任务。如果1号是工作日,则执行任务;如果1号是周末,则任务会延后到最近的工作日即2号执行。
#(日历偏移量)用于指定某个月份的第几个周几,例如0 0 0 ? * 3#1表示每个月的第一个星期三执行任务。

现在我们可以根据需要进行 cron 表达式的配置了。常用的 cron 表达式如下:

表达式描述
0/2 * * * * ?每2秒 触发
0 0/2 * * * ?每2分钟 触发
0 0 9 * * ?每天9点触发
0 0 9 10 * ?每月10号9点触发
0 0 23 L * ?每月最后一天23点触发
0 0 9,17 W * ?工作日的9点和17点触发
0 0 9,17 ? * 5#4每月的第四个星期五触发

给大家提供一个好用的工具,用于练习cron表达式的编写:在线Cron表达式生成器

完成最简单的定时任务之后,我们要考虑定时任务的集中管理和可配置化,定时任务的动态新增和删除等。拓展内容会放在后面的篇章,点关注,不迷路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值