在自己的线程中运行每个 Spring 调度程序
2022-09-03 05:44:49
我有多个带有注释的组件,我看到Spring一次只启动一个,即使它们被安排在同一时间运行。@Scheduled
我的用例如下。我希望每个@Scheduled注释在自己的线程中运行,但每个线程只能运行一次。
给定这个伪代码和两个调度程序:
@Scheduled(cron = "0 * * * * *") //run every minute
public void methodA() {
log.info("Running method A");
executeLongRunningJob("Finished method A");
}
@Scheduled(cron = "0 * * * * *") //run every minute
public void methodB() {
log.info("Running method B");
executeLongRunningJob("Finished method B");
}
private void executeLongRunningJob(String msg) {
Thread.sleep(70 seconds);
System.out.println(msg);
}
请注意,该任务花费的时间比计划程序计划运行的时间要长。这一点至关重要。我不希望调度程序在完成运行之前再次启动。
开箱即用地运行此代码会给我以下输出:
Running method A
Finished method A
Running method B
Finished method B
Running method A
Finished method A
Running method B
Finished method B
... and so on
因此,显然它在单个线程中运行两个调度程序。
当我使用昂贵的方法时,我几乎得到了正确的行为,除了昂贵的方法在新的调度程序启动之前没有完成。@Async
Running method A
Running method B
Running method A
Running method B
Finished method A
Finished method B
... and so on
我想要的是这个输出:
Running method A
Running method B
Finished method A
Finished method B
Running method A
Running method B
Finished method A
Finished method B
... and so on
我该如何做到这一点?我希望每个计划程序同时运行,但要等到它完成,然后才允许再次运行。请记住,我有两个以上的计划程序在同一时间运行,有时甚至不同。