定时任务Spring Schedule
发布日期:2021-05-08 14:12:42 浏览次数:18 分类:精选文章

本文共 1081 字,大约阅读时间需要 3 分钟。

常见的定时任务框架

实现方式 cron表达式 固定时间执行 固定频率执行 开发难易程度
JDK 的TimeTask-Timer 不支持 支持 支持 复杂
Spring Schedule 支持 支持 支持 简单
Quartz 支持 支持 支持

 

 

Spring Schedule :

1·开启定时任务

要开启定时任务功能,只需要在启动类上加载一个@EnableScheduling注解即可。

2·定义任务

  • 声明类,通过@Component注解注册到Spring容器

  • 类中定义方法,方法内部编写任务逻辑

  • 方法上添加注解@Scheduled(fixedRate = 1000)来定义任务执行频率,

    • 这里的fiexRate=1000,代表是每隔1000毫秒执行

默认情况下,定时任务的线程池大小只有1,当任务较多执行频繁时,会出现阻塞等待的情况,任务调度器就会出现时间漂移,任务执行时间将不确定。

自定义线程池的大小:

spring:

  task:
    scheduling:
      pool:
        size: 10

定时策略

在方法上添加注解@Scheduled可以控制定时执行的频率,有三种策略:

  • fixedRate:按照固定时间频率执行,单位毫秒,即每xx毫秒执行一次。

    • 如果上一个任务阻塞导致任务积压,则会在当前任务执行后,一次把多个积压的任务都执行完成

    • 举例:假如任务执行每秒1次,而第一个任务执行耗时4秒,会导致4个任务积压,在第一个任务执行后,积压的4个任务会立即执行,不再等待

  • fixedDelay:固定延迟执行,单位毫秒,即前一个任务执行结束后xx毫秒执行第二个任务。

    • 如果上一个任务阻塞导致任务积压,则会在当前任务执行后xx毫秒执行下一个任务

  • cron:知名的cron表达式,使用表达式规则来定义任务执行策略,与fixedDelay类似的。

@Componentpublic class HelloJob {    @Scheduled(fixedRate = 1000)    public void hello(){        log.info("hello spring schedule!");    }}
@Componentpublic class HelloJob {    @Scheduled(cron = "0/2 * * * * ?")    public void hello() throws InterruptedException {        log.info("hello spring schedule!");    }}

 

上一篇:Redis分布式锁原理
下一篇:Hibernate Validator常用注解

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月26日 18时48分13秒