0

我将 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(..) 如果我们将列表存储在正文中,它工作正常,但由于某些限制,我无法将它存储在正文中。如果我获得代码来迭代和并行处理 Camel Header 中存在的集合,这将很有帮助。

问候, 拉格万

4

2 回答 2

2

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

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

在您的路线定义中,您可以根据标头属性进行拆分并并行处理它们。

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

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

于 2018-10-04T13:59:55.663 回答
0

您可以使用Recipient List 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);

您可以注意到列表中的每个元素都有一个有效的http4 Camel 组件 url。该组件用于进行 http 调用。您可以在该列表中添加任何您想要的内容(其他 Camel 的组件)。

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

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

或在 Java DSL 中:

from("...")
  ...
  .recipientList(header("yourHeaderName"));
于 2018-09-25T12:36:17.443 回答