Parallel processing ApacheCamel-并行处理器然后连接输出

Parallel processing ApacheCamel-并行处理器然后连接输出,parallel-processing,apache-camel,spring-camel,Parallel Processing,Apache Camel,Spring Camel,我希望对从不同来源获取不同信息的两个处理器进行并行处理,然后当两个处理器都完成时,我希望能够访问两个输出以进行进一步处理,例如比较 某种程度上: from("direct:start) .processor("process1") .processor("process2") .to("direct:compare"); 除了我需要process1和process2的输出在compare endpoint中可用之外。这是使用多播和聚合

我希望对从不同来源获取不同信息的两个处理器进行并行处理,然后当两个处理器都完成时,我希望能够访问两个输出以进行进一步处理,例如比较

某种程度上:

from("direct:start)
            .processor("process1")
            .processor("process2")
      .to("direct:compare");

除了我需要process1和process2的输出在compare endpoint中可用之外。

这是使用多播和聚合策略实现的一种方法

public class App {
  public static void main(String[] args) throws Exception {

    CamelContext context = new DefaultCamelContext();
    context.addRoutes(myRoute());
    context.startRoute("start");
    context.start();
    ProducerTemplate producerTemplate = context.createProducerTemplate();
    producerTemplate.sendBody("direct:start", null);
    Thread.sleep(10_000);
    context.stop();

  }

  private static RouteBuilder myRoute() {
    return new RouteBuilder() {
      @Override
      public void configure() throws Exception {
        from("direct:start").routeId("start")
                .multicast(new MyAggregationStrategy())
                .parallelProcessing()
                .to("direct:process1", "direct:process2", "direct:process3")
                .end()
        .to("direct:endgame");

        from("direct:process1")
                .process(e -> {
                  ArrayList<String> body = Lists.newArrayList("a", "b", "c");
                  e.getIn().setBody(body);
                });

        from("direct:process2")
                .process(e -> {
                  ArrayList<String> body = Lists.newArrayList("1", "2", "3");
                  e.getIn().setBody(body);
                });

        from("direct:process3")
                .process(e -> {
                  ArrayList<String> body = Lists.newArrayList("@", "#", "$");
                  e.getIn().setBody(body);
                });


        from("direct:endgame")
                .process(e -> {
                  log.info(" This final result : " + e.getIn().getBody());
                });
      }
    };
  }
}

//This is where we can aggregate results of the process which is running in parallel
class MyAggregationStrategy implements AggregationStrategy {

  @Override
  public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
    ArrayList<Object> objects = Lists.newArrayList();
    if (oldExchange == null) {
      return newExchange;
    }

    Object o = oldExchange.getIn().getBody();
    Object n = newExchange.getIn().getBody();

    objects.add(o);
    objects.add(n);

    newExchange.getIn().setBody(objects);

    return newExchange;
  }
}

您可以使用GroupedBodyAggregationStrategy来实现自定义OneHank您也@Bedla,我用过它。@SunandPadmanabhan,所以我观察到这在direct上运行得很好,但是当我改为seda时,因为预期会同时启动多个生产者,它们都应该在每个线程上运行,即使process1/2/3尚未完成其工作,仍将使用零列表交换立即调用endgame endpoint。有什么想法吗?我不确定,我得自己试试。如果你能粘贴你试图实现的代码片段,那将很有帮助。@sunandmanabhan在这里