2014-01-16 9 views
5

Hier ist was ich versuche zu tun. Ich habe zwei Dateien zu lesen, die diesen Inhalt hatApache Camel verschmelzen zwei Dateien von verschiedenen Routen

<Person> 
<Requestor>Dinesh</Requestor> 
</Person> 

Um dies zu tun, habe ich eine Route

<route id="getPerson"> 
    <from uri="file:src/main/resources/xml?noop=true"/> 
    </route> 

Next Ich brauche eine andere Datei lesen namens Adresse

<Address> 
    <City>New York </City> 
</Address> 

Hier ist mein zweite Route

<route id="getAddress"> 
    <from uri="file:src/main/resources/xmlAddress?noop=true"/> 
    </route> 

Wie fusionieren ich diese beiden xmls in einer Verwendung enricher oder Aggregate die endgültige XML-Nachricht wie diese

<Person> 
    <Requestor>Dinesh</Requestor> 
    <Address> 
    <City>New York</City> 
    </Address> 
</Person> 

Irgendwelche Ideen aussehen zu lassen? Ich habe versucht, die Dokumentation zu folgen, aber alles, was sie sagt, wird an einige Web-Service-URI gesendet.

Das obige Szenario ist abgeschwächt Version von dem, was ich eigentlich tun möchte. Die richtige Situation für mich ist, dies zu tun- Schritt 1. Lesen Sie eine XML-Datei, Schritt 2: Rufen Sie einen Web-Service und erhalten Sie die Antwort. Schritt 3: Merge Antwort in Schritt 2 und fügen Sie es o Xml Körper in Schritt 1

EDIT 1: ich die benutzerdefinierte AggregatorStartegy Klasse schreiben kann. Ich schrieb so etwas wie diese

public class AggregationStrategy implements org.apache.camel.processor.aggregate.AggregationStrategy{ 

@Override 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    newExchange.getOut().setBody("<all>" 
       + oldExchange.getIn().getBody(String.class) 
       + newExchange.getIn().getBody(String.class) 
       + "</all>"); 
      return newExchange; 
} 

    } 

Was mit denen ich zu kämpfen, wie das Frühling xml zu schreiben, schreiben, wo ich hier sagen kann, ist, meine Nachricht oder Datei 1+ Nachricht oder Datei 2, gehen anzuschließen. Hier ist, wie meine eigentliche context.xml sieht aus wie

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring"> 
<route> 
    <from uri="file:src/main/resources/xmlPerson?noop=true"/> 

    <camel:to uri="direct:enrichMessage"></camel:to> 
</route> 
<route > 
    <from uri="file:src/main/resources/xmlAddress?noop=true"/> 
    <log message="**************RESPONSE FROM CATASK DSS:: \n ${body}" id="log_output"/> 
    <camel:to uri="direct:enrichMessage"></camel:to> 

</route> 
<route id="enrichMessage"> 
    <from uri="direct:enrichMessage"/> 
    <camel:enrich strategyRef="aggregationBean" /> 
    <log message="**************MERGED RESPONSE :: \n ${body}"/> 
</route> 

+0

Also, wo genau sich der Web-Service ins Spiel kommen? – Ralf

+0

Zum Beispiel .enrich ("http://serviceA.com?xxx") .enrich ("http: // serviceB? Xx"). Hier ist ein Beispiel. http://www.andrejkoelewijn.com/blog/2010/06/13/a-composite-rest-service-using-camel/. Es spielt keine Rolle, welche Lösung ich bekomme. Alles, was ich will, ist, zwei Dateien oder zwei Nachrichten zu einer zusammenzuführen. Ich habe diesen Beitrag modifiziert, um meine Situation zu erklären. Meine tatsächliche Situation ist - Schritt 1. Lesen Sie eine XML-Datei, Schritt 2: Rufen Sie einen Web-Service und erhalten Sie die Antwort. Schritt 3: Fügen Sie die Antwort in Schritt 2 ein und fügen Sie sie in Schritt 1 hinzu. –

+0

Die Überschrift "Frage" wurde bearbeitet. –

Antwort

5

ich es endlich herausgefunden. mein erstes Verständnis war, dass wir zwei Nachrichten in der Hand haben und sie für Ex fusionieren - Route 1 letzte Nachricht -

Dinesh

Route 2 letzte Nachricht -

<Address> 
    <city>New York</city> 
</Address> 

Mein Verständnis war dass ich, nachdem ich die zwei obigen Nachrichten hatte, einfach eine aggregationStaregy erstellen und sie zusammenführen könnte. Nun, meine Annahme war falsch. Die Funktionsweise von Enhancer ist, dass sie eine Nachricht in der Hand hat und bevor sie die Nachricht von der zweiten Route erhält, müssen wir Camel sagen: "Hey, bevor du die Nachricht Route 2 erhältst, hier ist die Nachricht von Route 1. Wenn du gehst die Nachricht von der Route 1, meine Aggregationsstrategie-Klasse verwenden, um sie zu verschmelzen „“

So

folgenden heraus nach dem enricher mit mir erwarte
<Person> 
    <name>Dinesh</name> 
</Person> 
<Address> 
    <city>New York</city> 
</Address> 

aber ich war nicht sicher, wie es zu tun.Hier ist, was ich tat und es war falsch Ansatz

<route id="getPerson"> 
<from uri="file:src/data/catask/person?noop=true" /> 
<to uri="direct:enrich"/> 
</route> 

<route id="getAddress"> 
<from uri="file:src/data/catask/address?noop=true" /> 
<to uri="direct:enrich"/> 
</route> 

<route id="enrich"> 
<from uri="direct:enrich"/> 
<enrich strategyRef="aggregationBean"/> 
<log message="After Merge ... ${body}"/> 
</route> 

<bean id="aggregationBean" class="com.mycompany.camel.canadatask.AggregationStrategy"/> 

Meine Java-Klasse sah aus wie dieses

public class AggregationStrategy implements 
    org.apache.camel.processor.aggregate.AggregationStrategy{ 



@Override 
public Exchange aggregate(Exchange message,Exchange resource) { 
    String old = resource.getIn().getBody(String.class); 
    System.out.println("OLD:: \n"+old); 
    String newMsg = message.getIn().getBody(String.class); 
    System.out.println("NEW:: \n"+newMsg); 
    System.out.println("MERGED::" + old + newMsg); 
    message.getIn().setBody(old+newMsg); 
      return message; 
} 

    } 

Jetzt natürlich der obige Code nicht funktioniert hat. Später erkannte ich den Fehler, mein Verständnis über Anreicherer war falsch.

Die korrekte Umsetzung ist so -

<route id="getPerson"> 
    <from uri="file:src/data/catask/person?noop=true" /> 
    <pollEnrich strategyRef="aggregationBean" uri="file:src/data/catask/address?noop=true"/> 
    <log message="After Merge ... ${body}"/> 
</route> 

<bean id="aggregationBean" class="com.mycompany.camel.canadatask.AggregationStrategy"/> 

Der Java-Code gleich geblieben -

public class AggregationStrategy implements 
    org.apache.camel.processor.aggregate.AggregationStrategy{ 



@Override 
public Exchange aggregate(Exchange message,Exchange resource) { 
    String old = resource.getIn().getBody(String.class); 
    System.out.println("OLD:: \n"+old); 
    String newMsg = message.getIn().getBody(String.class); 
    System.out.println("NEW:: \n"+newMsg); 
    System.out.println("MERGED::" + old + newMsg); 
    message.getIn().setBody(old+newMsg); 
      return message; 
} 

    }