1.pom的引入
定时任务不需要引入特别的依赖(也可以说在springboot中已经集成到spring-boot-starter里面了)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
2.配置
定时任务 只需要简单两步
举例:
(1)启动类加上注解 @EnableScheduling
@SpringBootApplication @EnableScheduling public class SpringbootSchedulingApplication { public static void main(String[] args) { SpringApplication.run(SpringbootSchedulingApplication.class, args); } }
(2)在需要执行的方法(定时任务实现类)上加上 @Scheduled(cron="*/9 * * * * ?")
@Component public class SchedulerTask1 { @Scheduled(cron="*/9 * * * * ?") private void task(){ System.out.println("定时任务"); } }
参数说明
@Scheduled
有两种参数设置方法,一种是 cron="*/9 * * * * ?"
,一种是 fixedRate = 9000
,都表示每隔9秒执行一次。
fixedRate 说明
@Scheduled(fixedRate = 9000)
:上一次开始执行时间点之后9秒再执行@Scheduled(fixedDelay = 9000)
:上一次执行完毕时间点之后9秒再执行@Scheduled(initialDelay=1000, fixedRate=9000)
:第一次延迟1秒后执行,之后按fixedRate的规则每9秒执行一次
spring的定时任务默认是单线程,多个任务执行起来时间会有问题(B任务会因为A任务执行起来需要20S而被延后20S执行)
因此可以添加线程池:
@Configuration @EnableScheduling public class SchedulingConfigurerConfiguration implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(10); taskScheduler.setThreadNamePrefix("project-init-poolScheduler-"); taskScheduler.initialize(); taskRegistrar.setTaskScheduler(taskScheduler); } }
添加一个完整的例子:
配置:
package com.ciicgat.employeefinancial.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration @EnableScheduling public class SchedulingConfigurerConfiguration implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(10); taskScheduler.setThreadNamePrefix("project-init-poolScheduler-"); taskScheduler.initialize(); taskRegistrar.setTaskScheduler(taskScheduler); } }
方法:
@Service public class ScheduleFactory { @Autowired ScheduleService scheduleService;
@Scheduled(fixedDelay = 60 * 1000 * 5) public void syncProductList() { scheduleService.syncProductList(); } @Scheduled(fixedDelay = 60 * 1000 * 8) public void syncProductDetails(){ scheduleService.syncProductDetails(); } }
注意:扫描注解的时候 ,需要扫描到这个service的包 (这个service的包在base-package下面)