【问题标题】:Run multiple instances of the SAME cron job in Spring在 Spring 中运行 SAME cron 作业的多个实例
【发布时间】:2016-06-29 13:33:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我正在寻找相同的东西你找到了吗@Bianca?

标签: java spring multithreading cron scheduled-tasks


【解决方案1】:

是的,很容易实现,但不是@Scheduled注解。 如何?让我先解释一下 Spring 的工作原理。

每个使用 @Scheduled 注释的方法的 Spring 都会创建一个新的 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 有用且简单,但它不是很灵活。但通过一些努力,您可以获得对计划任务的更多控制。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2017-10-18
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多