Apache Camel - Aufteilen und aggregieren - Old Exchange ist immer null

Ich sehe, dass diese Frage einige Male gestellt wurde, aber keiner der Beiträge half oder eine schlüssige Lösung hatte. Ich teile eine Nachricht auf und aggregiere sie dann mit Aggregator2. Der Code hat eine Ausnahme ausgelöst, da oldExchange immer null war. Zum Testen habe ich einen kleinen Code entworfen.

Ich habe eine Order-XML-Datei gelesen, die so aussieht

<Orders xmlns="http://some/schema/Order">
    <Order>
            <orderNum>1</orderNum>
    </Order>
    <Order>
            <orderNum>2</orderNum>
    </Order>
    <Order>
            <orderNum>3</orderNum>
    </Order>
    <Order>
            <orderNum>5</orderNum>
    </Order>
    <Order>
            <orderNum>6</orderNum>
    </Order>

Mein Kamel-Kontext sieht so aus

<camel:route>
<camel:from uri="file:src/data/catask/test?noop=true"/>
<camel:log message="${body}"></camel:log>
<camel:split>
<camel:xpath>//te:Orders/*</camel:xpath>
<camel:to uri="direct:logQueries"/>
<camel:to uri="direct:aggegateQueries"/>  
</camel:split>

</camel:route>

<camel:route>
<camel:from uri="direct:logQueries"/>
<camel:log message="After the call : \n ${body}"></camel:log>  
</camel:route>

 <camel:route>
<camel:from uri="direct:aggegateQueries"/>
<camel:aggregate strategyRef="aggrTask" completionInterval="8000" >
<camel:correlationExpression>
<camel:xpath>//te:Order</camel:xpath>
</camel:correlationExpression>
<camel:to uri="file:src/data/catask/output?fileName=output.xml"/>  

</camel:aggregate>
</camel:route>  

So sieht meine Aggregationsstrategie-Klasse aus

   public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
            if (oldExchange == null) { 
            System.out.println("Returning new exchange"); 
                return newExchange; 
            } 

            String oldBody = oldExchange.getIn().getBody(String.class); 
            String newBody = newExchange.getIn().getBody(String.class); 
            oldExchange.getIn().setBody(oldBody + "+" + newBody); 
            return oldExchange; 
        } 

Das Problem besteht darin, dass das aggregierte Ergebnis, wenn es in der Datei output.xml gespeichert wird, nur den letzten Datensatz enthält, den es aus Orders.xml gelesen hat.

d.h.

<Order xmlns="http://some/schema/Order">
            <orderNum>6</orderNum>
    </Order>

Ich habe weiter darüber nachgedacht und festgestellt, dass dies passiert ist, weil oldExchange nach dem ersten Aufruf einen Wert haben sollte, aber es stellt sich heraus, dass er immer null ist. Ich denke, weil es alles von einer einzelnen Akte liest und sie aufteilt, gibt es nur Austausch.

> Irgendwelche Vorschläge ??

UPDATE 1: Per Claus kann ich mit Splitter nur dieses Problem lösen. Ich habe das getan und konnte alle Nachrichten erfolgreich verbinden. Ich bin jedoch noch auf der Suche nach einer Möglichkeit, Aggregator2 zu verwenden. Hier, wie ich es nur mit Splitter gemacht habe.

camel:route>
<camel:from uri="file:src/data/catask/test?noop=true"/>
<camel:log message="${body}"></camel:log>
<camel:split strategyRef="aggrTask"> 
<camel:xpath>//te:Orders/*</camel:xpath>
<camel:to uri="direct:logQueries"/>
 < 
</camel:split>

</camel:route>

<camel:route>
<camel:from uri="direct:logQueries"/>
<camel:log message="After the call : \n ${body}"></camel:log>  
</camel:route>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage