gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:08:00 25 4
gpt4 key购买 nike

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

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

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

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

Spring 是否提供了任何东西来停止 @Scheduled 任务?

最佳答案

选项 1:使用后处理器

供应ScheduledAnnotationBeanPostProcessor并显式调用 postProcessBeforeDestruction(Object bean, String beanName) ,对于应该停止调度的 bean。


选项 2:维护目标 Bean 到其 future 的映射

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的调度时,可以查map得到对应的Future并明确取消它。

关于java - 如何停止使用@Scheduled注释启动的计划任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61447851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com