SpringBoot 定时任务

1. 实现方式

  A. Timer:JDK自带的一个定时调度类,可以简单的实现按某一频度进行任务执行,但不能在指定时间运行;

  B. ScheduledExecutorService:JDK自带的一个基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行;

  C. Spring Task:Spring3.0以后自带的task,支持Cron表达式,使用简单功能强大;

  D. Quartz:这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂;

  E. XXL-JOB:分布式调度框架,带有可视化界面,功能强大。

 

2. 任务分类

  A. 静态定时任务:基于注解形式@Scheduled;

  B. 动态定时任务:基于接口SchedulingConfigurer;

 

3. SpringBoot集成的schedule

  A. 步骤:在启动类中添加@EnableScheduling注解即可开启定时任务;在定时任务类上加@Component注解,并在方法上加@Scheduled(cron = "0 0 1 * * ?")注解,就会每天凌晨1点开始执行任务

  B. 注意点:Spring Scheduling默认是单线程执行的,同一个时间触发的任务是串行执行的,如果需要多线程执行,需要实现SchedulingConfigurer接口

  C. @Scheduled参数详解

cron 设置cron表达式,也可以采用cron="${cron.schedule}"动态读取配置文件cron值
fixedRate 上一次开始执行时间点之后多久时间再执行(ms)
fixedDelay 上一次执行完毕时间点之后多久时间再执行(ms)
initialDelay 第一次延迟多长时间后执行

  D. 实例(若要动态测试,简单的办法就是把类当做控制层访问即可)

 

 

4.  Scheduling 配置多线程

  A. SchedulerConfig配置


package com.ruhuanxingyun.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.ThreadPoolExecutor;

/**
* @description: 多线程任务调度配置
* @author: ruphie
* @date: Create in 2020/1/10 20:12
* @company: ruhuanxingyun
*/
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(taskScheduler());
}

@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
// 配置线程池大小,根据任务数量定制
taskScheduler.setPoolSize(15);
// 线程名称前缀
taskScheduler.setThreadNamePrefix("schedulerPool-thread-");
// 线程池关闭前最大等待时间,确保最后一定关闭
taskScheduler.setAwaitTerminationSeconds(60);
// 线程池关闭时等待所有任务完成
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
// 任务丢弃策略
taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

return taskScheduler;
}

}

   B. 线程池四种拒绝策略:

策略名 说明
AbortPolicy 默认策略,直接抛出RejectedExecution异常阻止系统正常进行
CallerRunsPolicy 该策略既不抛出任务,也不抛弃异常,而是将任务回馈至发起方,比如main线程
DiscardOldestPolicy 抛弃队列中等待最久的任务,然后把当前任务加入到队列汇总,尝试再次提交当前任务
DiscardPolicy 直接丢弃任务,不给予任何处理也不抛出异常

   C. 注意点:多任务可以并发执行,但是同任务执行,若它本身还没有执行完,但是定时时间到了,本次还是不能执行,必须等上一次执行完毕,若是要想执行,可以加上@EnableAsync、@Async注解

 

可参考:定时任务的使用

posted @ 2020-01-08 08:34  如幻行云  阅读(306)  评论(0编辑  收藏  举报