Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何并行运行相同@Scheduled作业的更多执行?_Java_Spring_Spring Boot - Fatal编程技术网

Java 如何并行运行相同@Scheduled作业的更多执行?

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 =

我有一个这样的实现,它不工作。如您所见,作业需要约5秒,并且应在
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);
  }
}