Apache Camel分离器与淡褐色seda队列

时间:2017-09-28 05:53:17

标签: apache-camel

我正在尝试执行文件导入过程,其中在给定文件夹的子目录中拾取文件,该子目录标识文件所针对的客户端,然后解析,拆分和发送记录Hazelcast SEDA排队。我想处理每个记录作为Hazelcast SEDA队列的读取,然后它返回一个可以聚合的状态代码(创建,更新或错误)。

我还会在首次选择文件时创建一份工作记录,并且我想用最终的创建,更新和错误计数来更新作业记录。

下面的JobProcessor创建此记录,并在邮件的标题中设置客户端组织和作业对象。 CensusExcelDataFormat读取Excel文件并为每一行创建一个Employee对象,然后返回一个Collection。

MobiResourceManager.xcodeproj

我遇到的问题是列表聚合立即发生,而不是获取状态列表,而是获得相同的Employee对象列表。我希望在SEDA队列上发送Employee对象,并且要聚合的队列上的处理返回值然后通过JobCompletionProcessor运行以更新作业记录。

1 个答案:

答案 0 :(得分:0)

您看到的行为是默认行为。 apache camel splitter documentation在splitter返回部分中清楚地说明了这一点。

  1. Camel 2.2或更早版本:Splitter默认返回最后一个 分裂的消息。
  2. Camel 2.3及更新版本: Splitter默认会返回 原始输入消息。
  3. 对于所有版本:您可以通过提供自己的版本来覆盖它 策略作为AggregationStrategy。此页面上有一个示例 (拆分聚合请求/回复样本)。请注意它是一样的 聚合器支持的策略。这个Splitter可以被视为 拥有轻量级聚合器。
  4. 因此,您可以看到您需要实施自己的拆分器聚合策略。为此,创建一个实现AggrgationStrategy的新类,如下面的代码:

    public class MyAggregationStrategy implements AggregationStrategy 
    {
        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
          if (oldExchange == null) //this would be null on the first exchange.
          {
               //do some work on the first time if needed
          }
          /*
             Here you put your code to calculate failed, updated, created. 
    
    
          */
        }
    }
    

    然后,您可以像下面的示例一样指定自定义聚合策略:

    .split(body(), new MyAggregationStrategy()) //Java DSL
    <split strategyRef="myAggregationStrategy"/> //XML Blueprint