在Spring中关闭@Scheduled任务

时间:2017-01-12 16:55:30

标签: java spring spring-boot

我遇到以下情况:一个ThreadPoolScheduler和两个用@Scheduled注释的方法。

@Bean
public ThreadPoolTaskScheduler serviceRegistryTaskScheduler() {
    final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize( 2 );
    return threadPoolTaskScheduler;
}

@Scheduled( initialDelay = 3000, fixedDelay = 3000 )
public void methodOne() {
    // do this
}

@Scheduled( initialDelay = 3000, fixedDelay = 3000 )
public void methodTwo() {
    // do that
}

我基本上想要停止两个@Scheduled方法中的一个。有办法吗?

1 个答案:

答案 0 :(得分:0)

很少有@Scheduled任务具有与他们所居住的应用程序上下文不同的生命周期,所以我不认为有一种方法可以阻止它们,除非你深入研究TaskScheduler内部。

但是,您可以将bean放入他们自己的小spring环境中,并将当前应用程序上下文作为父上下文。这样,您可以在需要时启动和停止子上下文。

另一个稍微脏一点的变化是使用单个上下文,但将@Scheduled方法放入@Component,然后在要停止调度时调用context.getBeanFactory().destroyBean(component);。如果你需要再次启动它,你需要再次创建和注册组件 - 这不是第一个解决方案那么漂亮。