如何超时Spring Boot @Scheduled Thread

时间:2015-07-31 05:33:47

标签: multithreading spring spring-boot spring-scheduled

我有一个Spring Boot应用程序,它在一天中的特定时间运行许多作业(由CRON配置)。 现在我发现应用程序正在运行但预定的作业没有被执行。 有没有办法在Spring中使用@Scheduled注释的任务添加超时。

因此,即使作业被阻止或等待,也可以将其杀死,以便允许其他线程顺利执行。线程可以等待指定的时间,然后如果任务没有完成,则终止该线程。

我知道我可以使用以下方法增加poolize:

Executors.newScheduledThreadPool();

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

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

1 个答案:

答案 0 :(得分: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 ...
  }
}