2016-09-12 120 views
1

我試圖用駱駝的充實與EIP定製AggregationStrategy即駱駝豐富和AggregationStrategy

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

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

輸出從HTTP端點返回XML響應。我希望能夠編組並將其設置爲newExchange的正文。

目前我通過注入JaxbDataFormatAggregationStrategy和調用解組方法這樣做..即

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; 
    } 

有沒有什麼更好的方法來做到這一點?

回答

-1

一個更好的(更簡潔)的方式可以是簡單地調用解組方法的路由本身並傳入數據格式:

的Java DSL:

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

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

的Spring 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

您會立即在您的en豐富/聚合

+0

我的要求是不要失去交易所的內容。 即如果調用豐富之前的'oldExchange'在Body中具有對象「A」,則在調用HTTP端點後返回一個OutputStream。 然後後續步驟應該有對象「C」(從輸出流獲得對象「A」和非編組對象'B'),現在所有這些只能在「AggregationStrategy」中完成。爲'newExchange'指定'dataformat',如果它的確可以直接從'newExchange'取出Object「C」 –

+0

你應該澄清一下,在你原來的文章中聲明爲:「HTTP輸出端點返回XML響應。我希望能夠這樣做,並將其設置爲新交易所的主體。「讓人相信不然。 –

0

只需在uri上使用「direct:route」,並使用該路由上的新交換(呼叫服務,設置標頭,解組數據)來完成所需的工作,交換結果將作爲新的彙總策略交換。