本文内容参考公众号 "Java技术栈"
通过@Scheduled开启的定时任务,当需要关闭的时候,可以通过自定义任务调度的方式进行关闭
首先需要添加一个配置类来替代原有的自动配置类
@Data
@Component
public class ThreadPoolTaskSchedulerComponent extends ThreadPoolTaskScheduler {
private Map<Object, ScheduledFuture<?>> scheduledTasks = new IdentityHashMap<>();
@Override
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
ScheduledFuture<?> future = super.schedule(task, trigger);
this.putScheduledTasks(task, future);
return future;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
ScheduledFuture<?> future = super.scheduleAtFixedRate(task, period);
this.putScheduledTasks(task, future);
return future;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
ScheduledFuture<?> future = super.scheduleAtFixedRate(task, startTime, period);
this.putScheduledTasks(task, future);
return future;
}
private void putScheduledTasks(Runnable task, ScheduledFuture<?> future) {
ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
scheduledTasks.put(runnable.getTarget(), future);
// scheduledTasks.put(runnable.getMethod(), future);
}
}
开启一个定时任务
@Component
public class AutoTask {
@Scheduled(cron = "*/3 * * * * *")
public void printTask() {
System.out.println("执行任务"+ LocalDateTime.now().toLocalTime());
}
}
本文通过controller来控制关闭定时任务
@RestController
public class StopController {
@Autowired
StopTask stopTask;
@GetMapping("stop")
void stopTaskController(){
stopTask.stopTask();
}
}
最后实现关闭的操作
@Service
public class StopTask {
@Autowired
ThreadPoolTaskSchedulerComponent component;
@Autowired
AutoTask autoTask;
public void stopTask(){
component.getScheduledTasks().get(autoTask).cancel(true);
}
}
需要再次开启的话,添加一个service
public void startTask(){
boolean cancelled = component.getScheduledTasks().get(autoTask).isCancelled();
if(cancelled){
ScheduledMethodRunnable runnable = new ScheduledMethodRunnable(autoTask, ReflectionUtils.findMethod(AutoTask.class, "printTask"));
component.schedule(runnable, new CronTrigger("*/1 * * * * *"));
}
}