当前位置: 代码迷 >> 综合 >> Spring中的任务调度:Spring Scheduled
  详细解决方案

Spring中的任务调度:Spring Scheduled

热度:91   发布时间:2023-12-15 03:55:38.0

SpringScheduled

      • 一、基本使用
      • 二、单线程与多线程的阻塞问题
      • 三、Cron表达式

一、基本使用

启动类添加@EnableScheduling

@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) throws JsonProcessingException {SpringApplication.run(Application.class);}
}

在需要定时的方法前添加@Scheduled

  • 可写Cron表达式
  • 或如fixedDelay,fixedRate等spring封装的时间格式
  1. fixDelay: 自上一次调度后的时间间隔,需要等上一次任务完全执行完毕
  2. fixRate: 自上一次进入调度方法后的时间间隔
  3. 其他还有如 initialDelay(指定初始化延迟)等属性

二、单线程与多线程的阻塞问题

SpringScheduled 调度时默认使用单线程。在多任务执行下会出现阻塞。

如果前一个任务一直未运行完毕,后一个任务到触发点时会一直等待前一个任务完成。

解决方案:指定使用线程池的任务调度队列,替换默认的单线程池

@Configuration
public class ScheduledBlockConfig implements SchedulingConfigurer {
    @Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));}
}

三、Cron表达式

Cron表达式通常有两种书写方式: 常规的七值和缺省的六值

表达式 意义
7位 秒 分 时 日 月 星期 年
6位 秒 分 时 日 月 星期 (年缺省)
/ 指定增量 例如 秒域 的 2/4 则代表第2秒开始,间隔4秒执行
* 配置任意时间段
仅在日期和星期域使用,代表不确定,或者缺省
- 出现在可以表示为时间段的域上 例如秒域 的 2-10 代表第2 至 10秒
# 仅仅能在星期域上面使用 a#b 代表 a周的星期b
相当于集合 例如 秒域 的 2,10,11,13 代表第 2 10 11 10秒都会被触发
  相关解决方案