0

我有一个与 EIP 设计相关的查询。我需要按块处理 csv 文件并调用 Rest API。完成整个文件的处理后,我需要调用另一个 Rest API,告诉处理完成。我希望处理路由所以如果终端系统不可用,我会在中间排队,重试将在代理级别发生。

我的流程如下。第一个流程:csv文件->按100条记录的块拆分->将消息放入队列

第二个流程(Transacted route):从队列中挑选消息 -> 调用其余 API

第二个流程已处理。由于我正在中断流程并且它是异步的,因此我不确定如何调用完成调用。我没有持久存储每个块处理的状态。

无论如何我可以使用 JMS 功能或 Camel 来实现它吗?

4

1 回答 1

0

您可以在第一个流程中使用 Camel Splitter EIP:
http ://camel.apache.org/splitter.html

仔细查看文档,您会发现每个拆分交换都有三个可用的交换属性:

  • CamelSplitIndex:一个拆分计数器,随着每个交易所被拆分而增加。计数器从 0 开始。
  • CamelSplitSize:拆分的交易所总数。此标头不适用于基于流的拆分。从 Camel 2.9 开始,此标头也设置在基于流的拆分中,但仅在已完成的 Exchange 上设置。
  • CamelSplitComplete: 这个交易所是不是最后一个。

由于它们是交换属性,因此您应该在将消息发送到队列之前将它们放在 JMS 标头中。但是您应该能够利用第二个流程中的信息,因此您可以知道哪条是最后一条消息。

但请记住,这一切都是异步的,因此该CamelSplitComplete标志并不一定意味着第二个流中的最后一条消息。您可以创建一个有状态的计数器或使用 Resequencer EIP http://camel.apache.org/resequencer.html来处理异步性。

于 2017-11-14T03:09:48.600 回答