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

Camel : Iterate the elements in the header,process it parallely

我正在 Apache camel header 中存储 url 的列表,下面是代码,

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

现在我需要迭代 header 中的这个列表并调用 url。这应该是并行activity。我尝试使用 split(..),如果我们将列表存储在 body 中,它工作正常,但由于某些限制,我无法将它存储在 body 中。如果我得到代码来迭代和并行处理 Camel Header 中存在的 collection,那将会很有帮助。

此致, 拉加文

您可以使用收件人列表EIP,参见http://camel.apache.org/recipient-list.html

您必须创建一个包含所有收件人的列表并将该列表存储到 header。我在您的代码中观察到您没有将该列表设置为 header,而是设置为 body。你必须做类似

的事情
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 of http4 Camel component.This 组件用于进行 http 调用。您可以在该列表中添加任何您想要的内容(其他 Camel 组件)。

然后你使用收件人列表EIP,告诉所有收件人都进入之前创建的header。 parallelProcessing = true,并行调用列表中的所有项目。这是在 XML DSL:

中调用的
<recipientList parallelProcessing="true">
   <header>yourHeaderName</header>
</recipientList>  

或 Java DSL:

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

您可以在 header 中设置列​​表并在 header 上拆分。

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

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