【问题标题】:How to timeout a Spring Boot @Scheduled Thread如何使 Spring Boot @Scheduled 线程超时
【发布时间】:2015-07-31 05:33:47
【问题描述】:

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

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

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

Executors.newScheduledThreadPool();

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

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

【问题讨论】:

    标签: multithreading spring spring-boot spring-scheduled


    【解决方案1】:

    您可以使用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 ...
      }
    }
    

    【讨论】:

    • 我使用@scheduled 在指定的 CRON 时间安排它们。用你给的方法,是否可以保持超时?如果线程在一段时间内没有完成执行,我希望线程被杀死或中断。这样其他线程就不会被打断了。
    • 是的,您可以保存 ScheduledFuture 实例并通过 isDone() 和 cancel() 检查它。您可以通过以下方式查看使用情况:docs.oracle.com/javase/7/docs/api/java/util/concurrent/…
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2021-04-30
    • 2020-10-02
    • 1970-01-01
    • 2020-05-23
    • 2016-08-21
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多