在Spring中运行SAME cron作业的多个实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Spring中运行SAME cron作业的多个实例相关的知识,希望对你有一定的参考价值。

我希望能够在Spring中运行SAME预定作业。在互联网上搜索后,我想出了如何同时运行多个不同的工作。

我有一个@Service注释类,它只有一个方法,用@Scheduled注释。我希望同时运行此作业的多个实例。

我没有使用Quartz或Spring Batch(我已经看过很多Spring Batch的例子)。

文档没有明确说明是否可以实现。

答案

是的,它很容易实现,但不能用@Scheduled注释。怎么样?我先来解释一下Spring的工作原理。

使用@Scheduled注释的每个方法的弹簧都会创建一个新的Runnable对象,然后将其调度执行到TaskScheduler(确切地说是ThreadPoolTaskScheduler)。要查看ScheduledAnnotationBeanPostProcessor.processScheduled()的确切代码。

因此,为了满足您的要求:拥有相同作业的多个实例,但是如果不使用Quartz或Spring Batch,我们需要放弃@Scheduled注释并执行与ScheduledAnnotationBeanPostProcessor默认情况下有所不同的操作。

@Configuration
public class SpringConfig  {

  @Autowired
  private TaskScheduler scheduler;

  @Autowired
  private YourServiceAnnotatedClass service;

  @PostConstruct
  public void startJobs() {
    int numOfJobInstances = 3;
    List<ImportantJob> jobs = IntStream.range(0, numOfJobInstances)
        .mapToObj(i -> new ImportantJob("job" + i, service))
        .collect(Collectors.toList());

    jobs.forEach(this::schedule);
  }

  private void schedule(ImportantJob job) {
    scheduler.schedule(job, new CronTrigger("*/5 * * * * *"));
    // Above CronTrigger with 5 seconds was used, but feel free to use other variants, e.g.
    // scheduler.scheduleAtFixedRate()
    // scheduler.scheduleWithFixedDelay()
  }

  @Bean(destroyMethod = "shutdown")
  public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(3); // Adjust it to your needs
    return taskScheduler;
  }
}

class ImportantJob implements Runnable {
  private final String name;
  private final YourServiceAnnotatedClass service;

  public ImportantJob(String name, YourServiceAnnotatedClass service) {
    this.name = name;
    this.service = service;
  }

  @Override
  public void run() {
    service.doSth();
  }
}

正如您所看到的,尽管@Scheduled非常有用且简单,但它并不是非常灵活。但通过一些努力,您可以更好地控制计划任务。

以上是关于在Spring中运行SAME cron作业的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

Docker 并行运行 cron 作业

Spring批处理Cron表达式:每3小时运行一次

如何将 Spring Batch Cron 作业迁移到 Spring Cloud 任务

AWS Beanstalk 中 Spring cron 作业的双重执行(2 个线程)

如何在服务器上的特定小时内每分钟运行一次cron作业

如何在 docker 容器中运行 cron 作业