SpringBoot项目如何使用SpringTask实现定时任务

124 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

前言

在平时工作中,经常需要使用定时任务。比如定时刷新缓存、或者在指定时间执行统计任务、定时发送消息等功能,那如何简单的实现一个定时任务呢?

配置

因为是SpringBoot项目,所以在自带的spring-context包中就已经带了定时任务的功能,所以只用在启动类上加上注解:@EnableScheduling,表示开启定时任务相关功能,然后就可以很方便的配置定时任务了。

代码

在Service或者新建一个类并标注@Component注解,然后新建一个方法,注意:新建方法的返回类型必须是void。在方法中书写要执行的业务逻辑。

然后在方法头上加上注解:@Scheduled,然后选择定时任务执行的策略填入属性,包含四种策略:

  1. cron :可以根据corn表达式指定的时间和频率运行
  2. fixedDelay:间隔时间是根据上次的任务结束的时候开始计时的,例如fixedDelay为3s,则表示上一次任务执行完成后,等待3s,下一次任务就会执行。
  3. fixedRate:按固定的时间频率运行,当一次任务存在延迟执行的情况,那下次的任务就会提前执行,不会依据上一次任务执行完成后等待固定的时间执行。
  4. initialDelay: 初始化延迟时间,也就是第一次延迟执行的时间。

总结

使用SpringTask的优缺点:

优点:代码简单,实现方便,复杂度不高,对一些简单的功能实现非常适用。

缺点:

  1. Spring 的定时任务默认是单线程执行,多任务情况下,任务的执行会受到影响,例如:定时任务到了该执行的时间点,但是上一个定时任务还没执行完成,则会影响当前定时任务的执行。
  2. SpringTask在多实例部署的情况下,各节点之间的任务执行频率和时间是不共享的,所以在一般情况下,会存在任务重复执行的情况。