简单的注解@Scheduled,轻松搞定 SpringBoot 的定时任务

实现指南

几个简单的注解,轻松搞定 SpringBoot 的定时任务

创建一个用于执行定时任务的类并在类上添加以下三个注解

  • @Component 加入IOC容器
  • @Configuration 设置为配置类
  • @EnableScheduling 开启定时任务,声明使用 scheduled

类中创建执行定时任务的方法并在方法上添加注解

  • @Scheduled @Scheduled 注解被ScheduledAnnotationBeanPostProcessor 类所拦截 SpringBoot使用 @scheduled 定时任务,执行的时候是在一个单线程中,如果前一个任务执行时间过长,则有可能会导致其他后续任务被阻塞,直到该任务执行完成。

此处推荐学习一下cron表达式的使用: https://www.matools.com/cron

案例

/**
 * @Author zqc
 * @Date 2020/9/29-13:59
 * @Description 定时任务类
 * 任务的类上写:
 * @Component           加入IOC容器
 * @Configuration       设置为配置类
 * @EnableScheduling    开启定时任务
 *
 * 任务方法上写@Scheduled
 */
@Component
@Configuration
@EnableScheduling
public class Jobs {

    /**
     * 单位是毫秒
     * fixedRate是每多次分钟一次,不论业务执行花费了多少时间,都是1分钟执行1次,
     * fixedDelay是当任务执行完毕后1分钟在执行
     */
    //表示方法执行完成后5000毫秒
    @Scheduled(fixedDelay = 5000)
    public void fixedDelayJob() throws InterruptedException {
        System.out.println("fixedDelay 每隔5秒" + new Date());
    }

    //表示每隔3000毫秒
    @Scheduled(fixedRate = 3000)
    public void fixedRateJob() {
        System.out.println("fixedRate 每隔3秒" + new Date());
    }

    /**
     * cron生成器: https://www.matools.com/cron
     * cron 共7位,  秒 分 时 日 月 星期 年
     * 第一位,表示秒,取值0-59
     * 第二位,表示分,取值0-59
     * 第三位,表示小时,取值0-23
     * 第四位,日期天/日,取值1-31
     * 第五位,日期月份,取值1-12
     * 第六位,星期,取值1-7,星期天,星期一...,注:不是第一周,第二周的意思;另外:1表示星期天,2表示星期一
     * 第七位,年份,可以留空,取值1970-2099
     *
     * (*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...
     * (?)问号:问号只能出现在日期和星期这两个位置。
     * (-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12
     * (,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四
     * (/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是0,15,30,45,60
     */
    //每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
    @Scheduled(cron = "0 0/5 14,18 * * ?")
    public void cronJob() {
        System.out.println("每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发:"+new Date());
    }

    //每天下午2点到下午2:55期间的每5分钟触发
    @Scheduled(cron = "0 0/5 14 * * ?")
    public void cronJobOneHour() {
        System.out.println("每天下午2点到下午2:55期间的每5分钟触发:"+new Date());
    }

    //表示每5分钟执行一次,是整点的5分钟,不是程序启动后开始计算的每5分钟
    @Scheduled(cron = "0 0/5 * * * ?")
    public void cronJob5Minutes() {
        System.out.println("每5分钟执行一次:"+new Date());
    }

}

cron 表达式配在 application.yml 中

#application.yml中的配置
scheduled:
  cron: * 0/5 * * * ?

@Scheduled 中获取这个配置

@Scheduled(cron = "${scheduled.cron}")

推荐阅读

end
  • 作者:suoyue_zhan(联系作者)
  • 发表时间:2020-11-16 05:56:50
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论