Java 如何并行运行相同@Scheduled作业的更多执行?
我有一个这样的实现,它不工作。如您所见,作业需要约5秒,并且应在Java 如何并行运行相同@Scheduled作业的更多执行?,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个这样的实现,它不工作。如您所见,作业需要约5秒,并且应在fixedRate1秒的时间内运行。这意味着应该有大约5个作业并行运行,但Spring会在开始另一个作业之前等待完成一个作业。。。 如果我添加第二个@Scheduled job'schedule2'并使用相同的and参数,则我有两个不同的作业并行运行,但决不是同一个作业。有没有可能做到这一点 @Scheduled(fixedRate = 1000) private void schedule1() { int index =
fixedRate
1秒的时间内运行。这意味着应该有大约5个作业并行运行,但Spring会在开始另一个作业之前等待完成一个作业。。。
如果我添加第二个@Scheduled job'schedule2'并使用相同的and参数,则我有两个不同的作业并行运行,但决不是同一个作业。有没有可能做到这一点
@Scheduled(fixedRate = 1000)
private void schedule1() {
int index = atomicInteger1.addAndGet(1);
logger.info("Run Schedule1 nr.{} started at: {}", index, LocalDateTime.now());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
logger.info("Schedule1 nr.{} finished at: {}", index, LocalDateTime.now());
}
}
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(10);
}
在这种情况下,每个计划任务将不会并行运行。这是因为任务比给定的
fixedRate
花费的时间更长。为什么?因为被调用,正如文档所说(粗体是我的):
。。。如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行
解决此问题的一种方法是使用和。以下是许多示例:
如果您真的想要实现您想要的,您应该自己管理线程,在单独的线程中从作业调用服务。。但我看不出有什么理由这么做,至少你只是在家里测试和玩弄宠物项目的工作 无论如何,看看这个:
这意味着应该有~5个作业并行运行,但Spring会等待一个作业完成后再开始另一个作业。
这意味着这些作业没有并行运行。您是在尝试执行调度还是并行处理?看起来您想要后者,但您滥用了调度。@Kayaman我试图将作业安排为每秒钟(或每分钟、每天或…)运行一次,即使同一作业的上一次运行没有完成already@VinayPrajapati,是的,这就是我想要解决的问题…@mirec我知道什么,但我在问为什么。您好,谢谢您的回答。“在这种情况下,每个计划任务将永远不会并行运行”。有没有并行运行的情况?@mirec您应该使用@Async
和@EnableAsync
。看看细节。是的,这就是诀窍,谢谢你@Maroun。我用@EnableAsync
启用了async,但我没有用@async
注释方法本身。请将您最近的注释添加到原始答案中,以便我可以接受它,好吗?谢谢。谢谢你@geeksusma。我只是想知道为什么我认为合理的期望不是由spring自己来管理的。就像另一个参数&;计划(allowParallel=true)事实上,这应该会在&;之间产生真正的区别;计划时间为fixedDelay vs fixedRate
@EnableAsync
public class Example {
@Async
@Scheduled(fixedRate = 1000)
public void schedule1() throws InterruptedException {
Thread.sleep(5000);
}
}