在Spring中运行多个相同cron任务实例

3
我希望能够在Spring中运行相同的定时任务。在搜索了互联网后,我发现如何同时运行多个不同的任务。
我有一个@Service注解类,其中只有一个方法,使用@Scheduled进行注解。我想要同时运行多个此作业的实例。
我没有使用Quartz或Spring Batch(我看到很多Spring Batch的示例)。
文档没有清楚地说明是否可以实现这一点。

我在找同样的东西,@Bianca 你有找到什么吗? - Aditya Vikas Devarapalli
1个回答

0

可以轻松实现,但不能使用@Scheduled注释。

怎么做呢?让我先解释一下Spring的工作原理。

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很有用且简单,但它并不是非常灵活。但是,通过一些努力,您可以更好地控制计划任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接