骆驼:迭代标题中的元素,并行处理

时间:2018-09-25 07:25:31

标签: java apache-camel spring-camel

我将URL列表存储在Apache骆驼标头中,下面是代码,

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

现在,我需要遍历标题中存在的这个列表并调用url。这应该是并行活动。我尝试了split(..),如果我们将列表存储在主体中,它会很好地工作,但是由于某些限制,我无法将其存储在主体中。如果我获得代码来迭代和并行处理Camel标头中的集合,这将很有帮助。

关于, 拉加万

2 个答案:

答案 0 :(得分:1)

您可以将列表设置在标题中,然后在该标题上拆分。

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

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

答案 1 :(得分:0)

您可以使用收件人列表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 Camel组件。该组件用于进行http调用。您可以在列表中添加任何想要的内容(其他骆驼的组件)。

然后,使用收件人列表EIP,告诉所有收件人都已进入先前创建的标头中。 parallelProcessing = true,并行调用列表中的所有项目。这就是在XML DSL中调用的方式:

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

或在Java DSL中:

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