Parallel processing 并行处理时不考虑Apache Camel调度程序延迟

Parallel processing 并行处理时不考虑Apache Camel调度程序延迟,parallel-processing,apache-camel,delay,scheduler,Parallel Processing,Apache Camel,Delay,Scheduler,在使用ApacheCamel(3.6.0)的SpringBoot(2.3.0.RELEASE)应用程序上,我在并行模式下遇到了调度程序组件的奇怪行为;特别是,我想创建一个路由,它每n秒执行一个给定的逻辑。 为此,我编写了以下示例: @Component public class TestRoute extends RouteBuilder { @Override public void configure() { from("scheduler:testRoute?de

在使用ApacheCamel(3.6.0)的SpringBoot(2.3.0.RELEASE)应用程序上,我在并行模式下遇到了调度程序组件的奇怪行为;特别是,我想创建一个路由,它每n秒执行一个给定的逻辑。 为此,我编写了以下示例:

@Component
public class TestRoute extends RouteBuilder {
  @Override
  public void configure() {
    from("scheduler:testRoute?delay=2000")
      .log(LoggingLevel.INFO, "Test route begin")
      .setBody(this::generateRandomBody)
      .split(body())
        .parallelProcessing()
        .process(this::consumeElement)
      .end()
      .log(LoggingLevel.INFO, "Test route end");
}

private List<Integer> generateRandomBody(Exchange exchange) {
  return IntStream.range(0, random(20)).boxed().collect(toList());
}

private void consumeElement(Exchange exchange) throws InterruptedException {
  Thread.sleep(random(1000));
}

private int random(int max) {
  return new Random().nextInt(max) + 1;
}
下面是一个没有并行处理的输出示例:

09:02:56.859    Test route begin
09:02:58.086    Test route end

09:02:58.868    Test route begin
09:02:59.266    Test route end

09:03:00.870    Test route begin
09:03:01.654    Test route end

09:03:02.871    Test route begin
09:03:04.028    Test route end

09:03:04.873    Test route begin
09:08:01.666    Test route begin
09:08:11.290    Test route end

09:08:13.292    Test route begin
09:08:21.707    Test route end

09:08:23.709    Test route begin
09:08:26.161    Test route end

09:08:28.162    Test route begin
09:08:37.761    Test route end

09:08:39.763    Test route begin
如您所见,在并行处理时,延迟不受影响,因为下一次轮询时间是根据当前轮询开始计算的;另一方面,在没有并行处理的情况下,下一次轮询时间约为当前轮询结束后2秒

这似乎有点奇怪,因为并行处理文档说明:

如果启用,则同时处理每个拆分的消息。注意:调用线程仍将等待所有消息完全处理完毕,然后继续。它只处理来自拆分器的同时发生的子消息


我错过了什么?如何并行处理消息并在实际路由完成后触发下一次轮询?

在Camel 3中,EIP已被大修为反应式,因此拆分器允许调度程序线程更快完成,因此可以接受2秒的延迟

如果希望计划的事务等待整个交换完成(无论不同线程如何处理它),则需要将其配置为同步。即使是骆驼2

 from("scheduler:testRoute?delay=2000&synchronous=true")

现在它工作得很好!我不知道还有什么比这更棒:你的产品还是你令人难以置信的快速回复:-)谢谢