Spring---设置定时任务@Scheduled后在符合条件时使定时任务停止

54 篇文章 1 订阅

1. 方式 1:通过Spring 的ScheduledAnnotationBeanPostProcessor 类终止定时任务

代码示例:

    /*得到BeanPostProcessor,用于终止定时任务*/
    @Autowired
    private ScheduledAnnotationBeanPostProcessor postProcessor;

    /**
     * 通过 ScheduledAnnotationBeanPostProcessor 终止所有定时任务
     */
    public void cancelScheduledTasks() {
        // 拿到所有的task(带包装)
        Set<ScheduledTask> tasks = postProcessor.getScheduledTasks();
        Set<Object> rawTasks = new HashSet<>(tasks.size());
        for (ScheduledTask task : tasks) {
            Task t = task.getTask();
            ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) t.getRunnable();
            Object taskObject = runnable.getTarget();
            // 将task所关联的对象放到Set中(就是带@Scheduled方法的类)
            rawTasks.add(taskObject);
        }
        // 调用postProcessBeforeDestruction()方法,将task移除并cancel
        for (Object obj : rawTasks) {
            postProcessor.postProcessBeforeDestruction(obj, "scheduledTasks");
        }

    }
详情参考: 重启Spring Scheduler的正确打开方式

2. 方式 2:通过类似钩子方法的方式,在定时任务类中定义一个 flag ,通过抛出线程的异常来结束定时任务

参见:spring boot定时任务中新建线程如何做到可控终止

3. 其他

其他参考:SpringBoot定时任务升级篇(动态添加修改删除定时任务)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值