2016-09-12 2 views
1

Ich versuche, Kamel enrich EIP zu verwenden mit benutzerdefinierten AggregationStrategy d.hKamel Enrich und AggregationStrategy

from("direct:xyz") 
    .setHeader("...","") 
    .enrich("http://localhost:myservice", new AggregationStrategy() { 

     public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
     ..... 
     } 
}); 

Ausgabe von HTTP-Endpunkt gibt XML-Antwort. Ich möchte, dass das gemarshallt und auf den Körper der newExchange gesetzt wird.

Derzeit ist dieses Ich mache von JaxbDataFormat zum AggregationStrategy Injektion und unmarshall Methode aufrufen .. d.h

public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    AnotherObj obj = dataFormat.unmarshall(newExchange, 
      newExchange.getIn().getBody(InputStream.class)); 

    Parentobj test = oldExchange.getIn().getBody(ParentObj.class) 

    test.setobj(obj) 
    oldExchange.getIn().setBody(test); 
    return oldExchange; 
    } 

Gibt es einen besseren Weg, dies zu erreichen?

Antwort

-1

Eine bessere (prägnante) Art und Weise einfach sein kann, dich die Abstellungsmethode in der Route rufen und im Datenformat übergeben:

Java DSL:

DataFormat jaxb = new JaxbDataFormat("com.acme.model"); 

from("activemq:My.Queue"). 
    unmarshal(jaxb). 
    to("mqseries:Another.Queue"); 

Frühling XML:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> 
    <dataFormats> 
    <jaxb id="myJaxb" prettyPrint="true" contextPath="org.apache.camel.example"/> 
    </dataFormats> 

    <route> 
    <from uri="direct:marshalled"/> 
    <unmarshal ref="myJaxb"/> 
    <to uri="mock:result"/> 
    </route> 

</camelContext> 

http://camel.apache.org/data-format.html

Sie würden dies tun direkt nach de Rich/Aggregation

+0

Meine Anforderung ist es nicht zu verlieren, was es in der Exchange gibt. if Wenn 'oldExchange' vor dem Aufruf von anreichern das Objekt" A "in Body hat, dann wird nach dem HTTP-Endpunkt aufgerufen, der einen OutputStream zurückgibt. Dann sollten die folgenden Schritte Objekt "C" haben (mit Objekt "A" und Unmarshalled Objekt "B" aus Outputstream erhalten.) All dies kann jetzt nur in der 'AggregationStrategy' erfolgen. Die API für Anreicherung nicht eine Option zur Angabe von 'dataformat' für' newExchange' zur Verfügung stellen Wenn das Objekt "C" direkt aus 'newExchange' entnommen werden könnte .. –

+0

Sie sollten das wahrscheinlich in Ihrem ursprünglichen Beitrag als die Aussage" Ausgabe von HTTP Endpunkt gibt XML-Antwort zurück. Ich möchte, dass das geregelt und auf den Körper des neuen Austauschs gesetzt wird. "Führt zu einem anderen Glauben. –

0

Verwenden Sie einfach "direct: route" auf der URI und tun, was Sie brauchen, mit dem neuen Austausch auf dieser Route (Anruf Service, Header setzen, unmarshall Daten), der resultierende Austausch wird als der neue erhalten Austausch in der Aggregationsstrategie.

Verwandte Themen