定时任务管理器
- 负责启动一个定时任务、停止一个定时任务、更新一个定时任务
public class ScheduleManager {
private final Logger logger = LoggerFactory.getLogger(ScheduleManager.class);
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
private final Map<String, ScheduleTaskHolder> cache = new ConcurrentHashMap<>();
public ScheduleManager(ThreadPoolTaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
public String startTask(ScheduleTask scheduleTask, String cron) {
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(scheduleTask, new CronTrigger(cron));
String key = UUID.randomUUID().toString();
ScheduleTaskHolder holder = new ScheduleTaskHolder(scheduleTask, scheduledFuture);
cache.put(key, holder);
logger.info("{} 定时任务启动成功!唯一标识为:{}", scheduleTask.getName(), key);
return key;
}
public void stopTask(String key) {
if (StringUtils.isBlank(key)) {
return;
}
ScheduleTaskHolder holder = cache.get(key);
if (Objects.isNull(holder)) {
return;
}
ScheduledFuture scheduledFuture = holder.getScheduledFuture();
boolean cancel = scheduledFuture.cancel(true);
if (cancel) {
logger.info("{} 定时任务停止成功!唯一标识为:{}", holder.getScheduleTask().getName(), key);
} else {
logger.error("{} 定时任务停止失败!唯一标识为:{}", holder.getScheduleTask().getName(), key);
}
}
public String changeTask(String key, String cron) {
if (StringUtils.isAnyBlank(key, cron)) {
throw new RuntimeException("定时任务的唯一标识以及新的执行表达式不能为空");
}
ScheduleTaskHolder holder = cache.get(key);
if (Objects.isNull(holder)) {
throw new RuntimeException(key + "唯一标识不存在");
}
stopTask(key);
return startTask(holder.getScheduleTask(), cron);
}
}
定时任务的任务接口
public interface ScheduleTask extends Runnable {
String getName();
}
定时任务和定时任务结果的缓存对象
public class ScheduleTaskHolder implements Serializable {
private ScheduleTask scheduleTask;
private ScheduledFuture scheduledFuture;
public ScheduleTaskHolder() {
}
public ScheduleTaskHolder(ScheduleTask scheduleTask, ScheduledFuture scheduledFuture) {
this.scheduleTask = scheduleTask;
this.scheduledFuture = scheduledFuture;
}
public ScheduleTask getScheduleTask() {
return scheduleTask;
}
public void setScheduleTask(ScheduleTask scheduleTask) {
this.scheduleTask = scheduleTask;
}
public ScheduledFuture getScheduledFuture() {
return scheduledFuture;
}
public void setScheduledFuture(ScheduledFuture scheduledFuture) {
this.scheduledFuture = scheduledFuture;
}
}
定时任务
public class ThreadPoolWarnTask implements ScheduleTask {
@Override
public String getName() {
return "threadPoolWarnTask";
}
@Override
public void run() {
}
}
使用姿势
- 引入 ScheduleManager 对象
- 开启定时任务、关闭定时任务、更新定时任务
String taskKey = scheduleManager.startTask(threadPoolWarnTask, CRON);
scheduleManager.stopTask(taskKey);
scheduleManager.changeTask(taskKey, newCRON);