我处于以下情况:一个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方法之一。有办法吗?

最佳答案

@Scheduled任务的生命周期与它们所驻留的Application上下文的生命周期不同,这是非常罕见的,因此,我认为除非您深入研究TaskScheduler的内部结构,否则您无法停止它们。

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

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

关于java - 在 Spring 关闭@Scheduled任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41618816/

10-10 18:05