2015-08-28 2 views
2

Мы используем сплиттер для итерации файлов в заархивированном файле, а также мы используем собственный агрегатор, который дает нам список тел - обоих файлов в этом основном архиве. Теперь, после этого разделения, я хотел бы извлечь заголовки, установленные во время обработки блока агрегации, которые происходят из результата агрегатора. Но результат агрегатора, кажется, затерялся, и я не получаю ничего после блока split.Apache Camel: Получение ответа агрегатора?

Я уверен, что я не получаю основы этого. Был бы признателен, если бы кто-то мог помочь здесь.

<route id="main-route"> 
     <split streaming="true"> 
      <ref>zipSplitter</ref> 
      <choice> 
       <when> 
        <method bean="fileHandler" method="isY" /> 
        <to uri="direct:y" /> 
       </when> 
       <otherwise> 
        <to uri="direct:x" /> 
       </otherwise> 
      </choice> 
      <to uri="direct:aggregate" /> 
     </split> 
     <!--Do something by extracting the headers set during the processing underneath in the aggregation block i.e. process-data --> 
</route> 
<route id="aggregate-data"> 
     <from uri="direct:aggregate" /> 
     <camel:aggregate strategyRef="aggregationStrategy" completionSize="2"> 
      <camel:correlationExpression> 
       <constant>true</constant> 
      </camel:correlationExpression> 
      <to uri="direct:process-data"/> 
     </camel:aggregate> 
</route> 

Aggregator-

public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    Object newBody = newExchange.getIn().getBody(); 
    Map<String, Object> newHeaders = newExchange.getIn().getHeaders(); 

    ArrayList<Object> list = null; 
    if (oldExchange == null) { 
     list = new ArrayList<Object>(); 
     list.add(newBody); 
     newExchange.getIn().setBody(list); 
     return newExchange; 
    } else { 
     Map<String, Object> olderHeaders = oldExchange.getIn().getHeaders(); 
     olderHeaders.putAll(newHeaders); 
     list = oldExchange.getIn().getBody(ArrayList.class); 

     list.add(newBody); 
     return oldExchange; 
    } 
} 

ответ

1

Вы должны держать совокупную логику внутри расщепленной сферы. Там должен быть единый агрегированный экземпляр делает агрегацию для разделения, как показано ниже,

 <route id="main-route"> 
     <split streaming="true" strategyRef="aggregationStrategy"> 
      <ref>zipSplitter</ref> 
      <choice> 
       <when> 
        <method bean="fileHandler" method="isY" /> 
        <to uri="direct:y" /> 
       </when> 
       <otherwise> 
        <to uri="direct:x" /> 
       </otherwise> 
      </choice>    
     </split> 
    </route> 

вы должны определить стратегию агрегации в разделенном тега в качестве атрибута, как приведенный выше код. Таким образом, обменный доход на каждой итерации будет доступен в компоненте стратегии агрегации для агрегирования.

Надеюсь, что это поможет :)

Смежные вопросы