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

本文内容参考公众号 "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 * * * * *"));
        }
}

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值