当前位置: 首页 > 面试题库 >

如何停止使用@Scheduled批注启动的计划任务?

衡丰茂
2023-03-14
问题内容

我已经使用Spring Framework的@Scheduled注释创建了一个简单的计划任务。

 @Scheduled(fixedRate = 2000)
 public void doSomething() {}

现在,当不再需要时,我想停止此任务。

我知道在此方法开始时可能有一种方法可以检查一个条件标志,但这不会停止执行此方法。

Spring提供了什么来停止@Scheduled任务?


问题答案:

选项1:使用后处理器

为应停止调度的bean
提供ScheduledAnnotationBeanPostProcessor并显式调用postProcessBeforeDestruction(Object bean, String beanName)

选项2:维护目标豆与其未来的映射

private final Map<Object, ScheduledFuture<?>> scheduledTasks =
        new IdentityHashMap<>();

@Scheduled(fixedRate = 2000)
public void fixedRateJob() {
    System.out.println("Something to be done every 2 secs");
}

@Bean
public TaskScheduler poolScheduler() {
    return new CustomTaskScheduler();
}

class CustomTaskScheduler extends ThreadPoolTaskScheduler {

    @Override
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
        ScheduledFuture<?> future = super.scheduleAtFixedRate(task, period);

        ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
        scheduledTasks.put(runnable.getTarget(), future);

        return future;
    }

    @Override
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
        ScheduledFuture<?> future = super.scheduleAtFixedRate(task, startTime, period);

        ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
        scheduledTasks.put(runnable.getTarget(), future);

        return future;
    }
}

当必须停止对bean的调度时,可以查找该映射以获取对应的映射Future并显式取消它。



 类似资料:
  • 我使用Spring Framework的注释创建了一个简单的计划任务。 我知道可以有一个选择在这个方法开始时检查一个条件标志,但这不会停止这个方法的执行。 Spring提供了什么来停止任务吗?

  • 我有一个简单的计划任务,它是使用@计划注释创建的。类似这样的东西- 我还有一个蓝绿色升级场景,在这个场景中,这个计划任务可能会在蓝色和绿色集群中运行。鉴于这个计划任务修改了数据库,其中一个节点可能会覆盖来自另一个节点的数据——或者最坏情况下的竞争条件。 我想暂停绿色集群上所有计划的任务,直到它准备好接受流量。我已经有了代码来监听应用程序状态的变化。 我探索了几个选择- 只需在任务开始时添加一个布尔

  • 问题内容: 我正在使用类,并且正在使用其schedule方法执行某些任务,但是在执行了6次之后,我必须停止其任务。 我该怎么办? 问题答案: 在某个地方保留对计时器的引用,并使用: 停止所做的一切。您可以将此代码放在正在执行的任务中,以计算您经过的次数,例如

  • 问题内容: 我一直在研究如何使用Java 8和spring在运行时更改作业的频率。这个问题非常有用,但是并不能完全解决我的问题。 现在,我可以配置下次上班的日期。但是,如果将延迟设置为1年,那么我需要等待1年才能考虑新配置。 我的想法是,如果更改了配置值(因此来自另一个类),则停止计划的任务。然后重新计算下一次应执行的任务。也许有更简单的方法可以做到这一点。 这是我到目前为止的代码。 这就是我想做

  • 我正在使用ScheduledExecutorService并对其进行初始化(ScheduledExecutorService scheduledThreadPool=Executors.NewScheduledThreadPool(20);)这样我就不会每次都创建新线程。然后,我使用计划“executorService.schedule(new Runnable(),20,timeUnit.sec

  • 本文向大家介绍详解在Spring3中使用注解(@Scheduled)创建计划任务,包括了详解在Spring3中使用注解(@Scheduled)创建计划任务的使用技巧和注意事项,需要的朋友参考一下 Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了: 创建一个Java类,添加一个无参无返回值的方法,在方法上用@Scheduled注解修饰一下; 在Spr