4

我有一个 Spring Boot 应用程序,它在一天中的特定时间运行许多作业(由 CRON 配置)。现在我发现应用程序正在运行,但计划的作业没有得到执行。有什么方法可以在 Spring 中为使用 @Scheduled 注释的任务添加超时。

这样即使作业被阻塞或等待,也可以被杀死,从而让其他线程顺利执行。线程可以等待指定的时间,然后如果任务还没有完成,就杀死线程。

我知道我可以使用以下方法增加池大小:

Executors.newScheduledThreadPool();

但是如果最终所有线程都被阻塞会发生什么

我浏览了论坛,看到了提到使用 FutureTasks 的解决方案。这可以应用于带有@Scheduled 注释的任务吗?由于应用程序是 spring-boot,因此没有配置超时的 xml 配置。

4

1 回答 1

2

您可以使用它TaskScheduler来启动和控制任务。在你的@Configuration课堂上:

@Configuration
public class YourConfig {

  @Bean
  public TaskScheduler scheduler() {
    return new ThreadPoolTaskScheduler();
  }
  // ...

之后,您可以通过以下方式安排任务:

@Service
public class YourTaskRunnable implements Runnable {

  @Autowired
  private TaskScheduler scheduler;

  @PostConstruct
  private void init() {
    ScheduledFuture future = this.scheduler.schedule(this, /* to execute immediately, for example */ Calendar.getInstance().getTime());
    // ...
  }


  @Override
  public void run() {
  // Your task code ...
  }
}
于 2015-07-31T07:22:04.997 回答