繁体   English   中英

Apache 并行处理时不考虑骆驼调度程序延迟

[英]Apache Camel Scheduler delay not respected while parallel processing

在使用Apache Camel (3.6.0) 的Spring Boot (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;
}

scheduler.delay参数设置为 2000 我希望下一次轮询将在当前轮询结束后 2 秒后触发; 但是,只有禁用并行处理才能做到这一点。

其实这里有一个output并行处理的例子:

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

这是没有并行处理的 output 的示例:

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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM