定义定时任务抽象层 AbstractScheduling
package com.rachel.system.cron;
import com.rachel.system.model.cron.CronEntity;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class AbstractScheduling {
protected abstract CronEntity getCron();
protected abstract void scheduled();
protected void execute(){
log.info("执行定时任务: <{}>",getCron().getTaskName());
log.info("定时任务表达式: <{}>",getCron().getCron());
this.scheduled();
}
}
CronEntity
package com.rachel.system.model.cron;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CronEntity implements Serializable {
private String taskName;
private String cron;
private String createTime;
}
定义AbstractScheduling的处理器
getCron() 获取数据库配置的定时任务信息,比如cron
scheduled() 定时任务的执行内容(即业务功能)
package com.rachel.system.cron.handler;
import com.kynchen.manage.common.util.DateUtils;
import com.rachel.system.common.enums.CronCodeEnum;
import com.rachel.system.cron.AbstractScheduling;
import com.rachel.system.model.cron.CronEntity;
import com.rachel.system.model.vo.domain.ScheduledDO;
import com.rachel.system.model.vo.domain.ScheduledQueryDO;
import com.rachel.system.repository.SystemScheduledRepository;
import com.rachel.system.service.SystemApiService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class SystemApiScheduledHandler extends AbstractScheduling {
@Resource
private SystemScheduledRepository systemScheduledRepository;
@Resource
private SystemApiService systemApiService;
@Override
protected CronEntity getCron() {
ScheduledQueryDO scheduledQueryDO = new ScheduledQueryDO();
scheduledQueryDO.setCode(CronCodeEnum.SYSTEM_WHITE_API.getCode());
ScheduledDO scheduledDO = systemScheduledRepository.query(scheduledQueryDO);
return new CronEntity(scheduledDO.getName(),scheduledDO.getCron(), DateUtils.formatNowDate());
}
@Override
protected void scheduled() {
systemApiService.syncSystemApi();
}
}
定义定时任务配置抽象层,实现 SchedulingConfigurer
package com.rachel.system.cron;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
public abstract class AbstractSchedulingConfigurer implements SchedulingConfigurer {
@Resource
protected List<AbstractScheduling> abstractSchedulingList;
protected abstract TaskScheduler getTaskScheduler();
protected List<AbstractScheduling> getTaskList(){
return this.abstractSchedulingList;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
log.info("[AbstractSchedulingConfigurer.configureTasks] 定时任务执行器 start");
scheduledTaskRegistrar.setScheduler(getTaskScheduler());
if(CollectionUtils.isEmpty(getTaskList())){
log.info("待执行的定时任务为空");
}
getTaskList().forEach(scheduling ->
scheduledTaskRegistrar.addTriggerTask(
scheduling::execute,
triggerContext -> new CronTrigger(scheduling.getCron().getCron()).nextExecutionTime(triggerContext)));
}
}
定义AbstractSchedulingConfigurer的处理器
这里目前只做了线程池的配置
AbstractSchedulingConfigurer 可以定义更多配置,由子类去实现
package com.rachel.system.cron.handler;
import com.rachel.system.cron.AbstractSchedulingConfigurer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import javax.annotation.Resource;
@Configuration
@Slf4j
public class SchedulingConfigHandler extends AbstractSchedulingConfigurer {
@Resource(name = "taskScheduler")
private ThreadPoolTaskScheduler taskScheduler;
@Override
protected TaskScheduler getTaskScheduler() {
return this.taskScheduler;
}
}
线程池配置
package com.rachel.system.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.Optional;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
public class ThreadLocalConfig {
@Bean("taskScheduler")
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
scheduler.setThreadNamePrefix("task-scheduled-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
}