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

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

Другие вопросы по тегам