Spring 定时任务 --基于Spring boot
简单介绍:Spring3.0 通过@EnableScheduling来开启定时任务,通过@Scheduled注解来创建定时任务。Spring schedule 可以看成一个轻量级的Quartz,而且使用起来比Quartz简单许多
@EnableScheduling 注解:它的作用是发现注解 @Scheduled的任务并由后台执行。没有它的话将无法执行定时任务。
官方文档原文:@EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled.
@Scheduled中的参数说明:
@Scheduled(fixedRate=2000):上一次开始执行时间点后2秒再次执行;上一个任务的开始到下一个任务开始时间的间隔
@Scheduled(fixedDelay=2000):上一次执行完毕时间点后2秒再次执行;表示上一次任务执行完成后多久再次执行
@Scheduled(initialDelay=1000, fixedDelay=2000):第一次延迟1秒执行,然后在上一次执行完毕时间点后2秒再次执行;
@Scheduled(cron="* * * * * ?"):按cron规则执行。指定任务在特定时间执行
- cron:强调任务在某时某分某刻执行的定时任务用cron表达式,;
- fixedDelay:强调任务间隔的定时任务 用fixedDelay 或者 fixedRate。
1.配置定时任务,基于Springboot,只要引入起步依赖就可以,不需要其它配置。
2.创建并开启定时任务
package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class ScheduledJob {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(fixedDelay = 3000)
public void testScheduledFixedDelay() {
logger.info("===this is fixed delay");
}
@Scheduled(fixedRate = 5000)
public void testScheduledFixedRate() {
logger.info("===this is fixed Rate");
}
@Scheduled(cron = "* * * * * ?")
public void testScheduledCron() {
}
}
启动项目 ,会打出如下log
3.开启多线程处理定时任务:
Spring schedule的定时任务默认是单线,参考 Spring Boot 定时任务单线程和多线程。是因为在源码中,从ScheduledAnnotationBeanPostProcessor类开始一路找下去。在ScheduledTaskRegistrar(定时任务注册类)中的ScheduleTasks中又这样一段判断:
if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}
所以要开启多线程,就可以实现多线程 执行定时任务:
package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class ThreadConfiguration {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
return scheduler;
}
}
再次运行项目,打出log如下
4.开启多线程 执行定时任务---方法2
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
* 多线程执行定时任务
* 所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。
*/
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}
5.几种任务调度方式
spring-boot-2.0.3之quartz集成,数据源问题,源码探究