栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873766.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号