第一种使用Schedule这个定时器 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies> 先在启动类上加@EnableScheduling开启Schedule定时器 然后写自定义定时任务,每个方法都是一个任务方法上用@Scheduled这个注解,注解里的是表达式,表示多长时间执行一次 在线表达式生成器http://cron.qqe2.com/ 可以按自己的想法选择 package com.buba.schedule;import com.buba.mapper.WitkeyDemandApplyMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Componentpublic class DemandSchedule { @Autowired private WitkeyDemandApplyMapper witkeyDemandApplyMapper; //每天凌晨执行一次 @Scheduled(cron = "0 0 0 * * ? ") public void processUpdateApplyStatus(){ witkeyDemandApplyMapper.updateAllApplyOverdue(); } //一秒一次 @Scheduled(cron = "0/1 * * * * ? ") public void test1(){ System.out.println("一秒一次"); } //两秒一次 @Scheduled(cron = "0/2 * * * * ? ") public void test2(){ System.out.println("两秒一次"); }} 写好后直接启动项目定时器就自己执行了 可以看到三个定时任务都已经执行,并且使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。 多线程执行
在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类 @Configuration@EnableAsyncpublic class AsyncConfig { /* 此处成员变量应该使用@Value从配置中读取 */ private int corePoolSize = 10; private int maxPoolSize = 200; private int queueCapacity = 10; @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.initialize(); return executor; }}
@Configuration:表明该类是一个配置类
@EnableAsync:开启异步事件的支持 然后在定时任务的类或者方法上添加@Async 。最后重启项目,每一个任务都是在不同的线程中