Springboot执行多个定时任务并动态获取定时任务信息
第一步,在入口类中声明定时任务
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling //声明定时任务
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
第二步,创建定时任务对象,需要实现SchedulingConfigurer接口,其中有两个入参doTask业务逻辑,getTrigger触发器
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
/**
* (SchedulerTask)数据同步
*
* @author zhu
* @since 2021-01-29 13:37
*/
@Component
@Configuration //1.主要用于标记配置类,兼备Component的效果。
public class SchedulerTask implements SchedulingConfigurer {
//记录日志
private Logger logger = LoggerFactory.getLogger(SchedulerTask.class);
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//获取定时任务执行信息
List<SchedulerConfig> tasks = getAllTasks(SchedulerConfig);
if (tasks.size() > 0) {
for (int i = 0; i < tasks.size(); i++) {
try {
// 注册计时任务到Scheduling接口
taskRegistrar.addTriggerTask(getRunnable(tasks.get(i)), getTrigger(tasks.get(i)));
} catch (Exception e) {
logger.error("定时任务启动错误:" + e.getMessage());
}
}
}
}
//从数据库里取得所有要执行的定时任务
private List<SchedulerConfig> getAllTasks(SchedulerConfig SchedulerConfig) {
List<SchedulerConfig> list = new ArrayList<>();
list = SchedulerConfigMapper.getSchedulerConfigList(SchedulerConfig);
return list;
}
//执行业务逻辑
private Runnable getRunnable(SchedulerConfig SchedulerConfig) {
return new Runnable() {
@Override
public void run() {
try {
//业务逻辑代码
} catch (Exception e) {
logger.error("同步定时任务执行失败:" + e.getMessage());
}
}
};
}
//获取下次执行时间
public Trigger getTrigger(SchedulerConfig SchedulerConfig) {
return new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
SchedulerConfig cpSyncCron = new SchedulerConfig();
cpSyncCron = SchedulerConfigMapper.getSchedulerConfigCron(SchedulerConfig);
String cron = "";
if (cpSyncCron != null) {
cron = cpSyncCron.getCron();
}
if (cron == null || "".equals(cron)) {
return null;
}
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExec = cronTrigger.nextExecutionTime(triggerContext);
return nextExec;
}
};
}
}