springboot项目使用SchedulingConfigurer实现多个定时任务的案例代码
小志的博客 人气:0一、引入依赖
pom文件引入依赖包
<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--hutool插件--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.7</version> </dependency>
二、配置文件属性配置
application.yml配置文件配置
upload: #每天几点几分执行 taskOnecron: 0 47 21 ? * * #每2分钟执行一次 taskTwocron: 0 0/2 * * * ?
三、代码目录结构
目录结构如下图:
四、示例代码
4.1、定义 定时任务基础接口
定时任务基础接口 代码示例
package com.xz.jdk11.schedule; /** * @author xz * @description 定义 定时任务基础接口 */ public interface BaskTask extends Runnable{ //获取执行频率 String getCron(); //执行任务逻辑 void execute(); }
4.2、定义 定时任务一(每天几点几分执行)
定时任务一(每天几点几分执行) 代码示例
package com.xz.jdk11.schedule; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Calendar; /** * @author xz * @description 定时任务一(每天几点几分执行) */ @Slf4j @Component public class TaskOne implements BaskTask{ @Value("${upload.taskOnecron}") private String taskOnecron; @Override public String getCron() { return taskOnecron; } @Override public void execute() { log.info("定时任务一(每天几点几分执行一次),执行开始时间:{}",Calendar.getInstance().getTime()); } @Override public void run() { execute(); } }
4.3、定义 定时任务二(每几分钟执行一次)
定时任务二(每几分钟执行一次) 代码示例
package com.xz.jdk11.schedule; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Calendar; /** * @author xz * @description 定时任务二(每几分钟执行一次) */ @Slf4j @Component public class TaskTwo implements BaskTask{ @Value("${upload.taskTwocron}") private String taskTwocron; @Override public String getCron() { return taskTwocron; } @Override public void execute() { log.info("定时任务二:每几分钟执行一次,执行开始时间:{}", Calendar.getInstance().getTime()); } @Override public void run() { execute(); } }
4.4、定义 定时任务注册器
定时任务注册器 代码示例
package com.xz.jdk11.schedule; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; 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; import org.springframework.scheduling.support.CronTrigger; import java.util.Map; /** * @author xz * @description 定时任务注册器 */ @EnableScheduling @Configuration @Slf4j public class ReUploadTask implements SchedulingConfigurer { @Autowired private ApplicationContext applicationContext; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { //在注册器添加定时任务前,添加线程池 ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(10); threadPoolTaskScheduler.initialize(); scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); //获取所有的定时任务 Map<String,BaskTask> map=applicationContext.getBeansOfType(BaskTask.class); //遍历注册 for(String key:map.keySet()){ BaskTask baskTask = map.get(key); scheduledTaskRegistrar.addTriggerTask( baskTask,triggerContext -> { if(StrUtil.isBlank(baskTask.getCron())){ return null; } return new CronTrigger(baskTask.getCron()).nextExecutionTime(triggerContext); } ); } } }
4.5、运行springboot项目查看输出结果
输出结果如下所示:
加载全部内容