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

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定时任务升级篇(动态添加修改删除定时任务)

上一篇:ActiveMQ延迟投递


下一篇:圣诞之 @Scheduled的原理