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>
Вы должны указать свою стратегию агрегирования в теге split в качестве атрибута, подобного приведенному выше коду. Таким образом, обменный возврат на каждой итерации будет доступен в компоненте агрегации стратегии для агрегации.
Надеюсь, поможет:)