SpringBoot:定时任务
定时任务@Scheduler
Spring支持使用注解@Scheduler标记定时任务。
@Scheduler可以传入六个参数,分为下面四种:
- fixedDelay: 每次方法执行完毕后,等待Nms再执行此方法。(fixedDelayString与他一样,只是参数是字符串,重点支持占位符,如${})
eg:@Scheduled(fixedDelay=1000)- fixedRate: 每隔5s调用一次此方法,无论之前的方法是否执行完毕.(fixedRateString这个与他一样,参数为String,重点支持占位符,如${})
eg: @Scheduled(fixedRate=5000)- initialDelay: 第一次调用此方法前的等待时间
eg:@Scheduled(initialDelay=1000, fixedRate=5000),同样,存在(initialDelayString,支持占位符)- 最后是cron表达式,支持占位符,参数为String
eg: @Scheduled(cron=" */5 * * * * ? ")//五秒一次里面参数分别代表:second, minute, hour, day of month, month, day of week
用的较多的主要是corn表达式,如果不会,随便百度cron表达式验证,就有那种在线网站可以UI到表达式双向解析。当然也可以学习一下他的写法,这里就不细讲了。
线程池配置
可以使用默认的线程池,当然这里要说一下自定义线程池
TaskScheduler是spring的定时任务使用的线程池的关键类。其类继承关系可以看一下我上一篇文章。https://blog.csdn.net/weixin_39789689/article/details/98469341
/**
* 通过实现SchedulingConfigurer对定时任务线程池进行更细致配置
* @author hby
*
*/
@Component
@Configuration
public class MySchedulingConfigurer implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskScheduler.setPoolSize(10);//参数可以配到配置文件
taskScheduler.initialize();
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
//不想重写就直接用默认的也不是不行;
//return Executors.newScheduledThreadPool(100);
return new ScheduledThreadPoolExecutor(10, new ThreadFactory() {
private AtomicInteger max = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "myScheConfig-" + max.incrementAndGet());
}
});
}
}
同时定时任务可以动态修改;
SchedulingConfigurer 动态修改定时规则,网上有两种方法,都有缺点。
- 一种如下:
https://blog.csdn.net/xht555/article/details/53121962
此方法,是在触发运行的时候,刷新定时规则,这种方法的缺点是,刷新规则的时间必须是在某次触发运行的时候。
- 另一种是
https://blog.csdn.net/jianggujin/article/details/77937316
此方法基于 SchedulingConfigurer 的源码,捕获 ScheduledTaskRegistrar 类的实例,通过该类中的 TaskScheduler 实例操作定时任务的增删,而非采用 ScheduledTaskRegistrar.addTriggerTask 方法维护定时任务。所以需要自行写代码维护定时任务列表,可以通过数据库配置,来控制任务是否加载,删减。
3.重量级一点的话,其实还是建议使用第三方开源组件 Quartz。
SpringBoot启动定时任务
@EnableScheduling // 启动定时任务