package ${basePackage}.frame.schedule; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import ${basePackage}.module.system.ent.Schedule; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledFuture; public class Scheduler extends ThreadPoolTaskScheduler { private Map taskMap; public Scheduler() { taskMap = new HashMap<>(); setPoolSize(4); initialize(); } public boolean createOrRepeat(RunTask task) { if (taskMap.containsKey(task.taskId())) { ScheduledFuture scheduledFuture = taskMap.get(task.taskId()).future; scheduledFuture.cancel(false); } taskMap.put(task.taskId(), new TaskWrapper(task)); return true; } public boolean remove(String taskId) { if (taskMap.containsKey(taskId)) { ScheduledFuture scheduledFuture = taskMap.get(taskId).future; scheduledFuture.cancel(false); taskMap.remove(taskId); } return true; } public boolean start(String taskId) { if (taskMap.containsKey(taskId)) { taskMap.get(taskId).run = true; taskMap.get(taskId).future = taskMap.get(taskId).target.schedule(this); return true; } return false; } public boolean stop(String taskId) { if (taskMap.containsKey(taskId)) { taskMap.get(taskId).run = false; ScheduledFuture scheduledFuture = taskMap.get(taskId).future; scheduledFuture.cancel(false); return true; } return false; } public List taskList() { List result = new ArrayList<>(); for (TaskWrapper taskWrapper : taskMap.values()) { Schedule schedule = new Schedule(); schedule.setId(taskWrapper.taskId); schedule.setName(taskWrapper.taskName); schedule.setNote(taskWrapper.taskNote); schedule.setRun(taskWrapper.run); result.add(schedule); } return result; } class TaskWrapper { RunTask target; String taskId; String taskName; String taskNote; boolean run; ScheduledFuture future; public TaskWrapper(RunTask runTask) { this.target = runTask; this.taskId = runTask.taskId(); this.taskName = runTask.taskName(); this.taskNote = runTask.taskNote(); this.future = runTask.schedule(Scheduler.this); this.run = true; } } }