代码之家  ›  专栏  ›  技术社区  ›  Raghavan

Camel:迭代头中的元素,并行处理它

  •  0
  • Raghavan  · 技术社区  · 6 年前

    我将url列表存储在Apache camel头中,下面是代码,

    List<String> supplierHotelRefs = new ArrayList();
    supplierHotelRefs.add("a.com");
    supplierHotelRefs.add("b.com");
    supplierHotelRefs.add("c.com");
     exchange.getIn().setBody(supplierHotelRefs);
    

    现在我需要迭代标题中的列表,并调用url。这应该是并行活动。我试过用split(…)如果我们将列表存储在body中,这很好,但由于一些限制,我无法将其存储在body中。如果我得到迭代和并行处理Camel头中的集合的代码,这将非常有用。

    当做 拉加万

    2 回复  |  直到 6 年前
        1
  •  2
  •   Srini    6 年前

    您可以在标题中设置列表并在该标题上拆分。

    exchange.getIn().setHeader("supplierHotelRefs",supplierHotelRefs);
    

    在路由定义中,可以根据header属性进行拆分,并并行处理它们。

    from("").....
    //split based on the header
    split(header("supplierHotelRefs"))
    //process every split exchange parallely
    .parallelProcessing()
    //end split block
    .end()
    //continue route definition after split
    .log("completed split processing")
    

    请注意,调用线程仍将等待所有拆分消息完成。

        2
  •  0
  •   Themis Pyrgiotis    6 年前

    你可以用 收件人列表EIP 看见 http://camel.apache.org/recipient-list.html

    您必须创建一个包含所有收件人的列表,并将该列表存储到标题中。我在代码中观察到,您并没有将列表设置为标题,而是作为一个主体。你得做点什么

    List<String> supplierHotelRefs = new ArrayList();
    supplierHotelRefs.add("http4://a.com");
    supplierHotelRefs.add("http4://b.com");
    supplierHotelRefs.add("http4://c.com");
    exchange.getIn().setHeader("yourHeaderName", supplierHotelRefs);
    

    正如您所注意到的,列表中的每个元素都有一个有效的url http4 骆驼组件。此组件用于进行http调用。你可以把任何你想要的东西放进这个列表(其他骆驼组件)。

    然后使用收件人列表EIP,告知所有收件人都已进入上一个创建的标题。parallelProcessing=true,并行调用列表中的所有项。这在XML DSL中称为:

    <recipientList parallelProcessing="true">
       <header>yourHeaderName</header>
    </recipientList>  
    

    或者在Java DSL中:

    from("...")
      ...
      .recipientList(header("yourHeaderName"));