如何停止正在执行的定时任务

如何停止正在执行的定时任务,第1张

本文内容参考公众号 "Java技术栈"

通过@Scheduled开启的定时任务,当需要关闭的时候,可以通过自定义任务调度的方式进行关闭

首先需要添加一个配置类来替代原有的自动配置类

@Data
@Component
public class ThreadPoolTaskSchedulerComponent extends ThreadPoolTaskScheduler {
    private Map> 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 * * * * *"));
        }
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/904899.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-15
下一篇2022-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存