2016-09-12 2 views
1

Я пытаюсь использовать Пополните EIP верблюжьего с клиентами AggregationStrategy т.е.Camel Обогатить и AggregationStrategy

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

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

Выхода из HTTP конечной точки возвращают ответ XML. Я бы хотел, чтобы это было упорядочено и установлено на тело newExchange.

В настоящее время я делаю это путем введения JaxbDataFormat к AggregationStrategy и вызову метода маршализации .. т.е.

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

Вы бы сделать это сразу же после того, как ваш ан rich/aggregation

+0

Мое требование - не потерять то, что есть на Бирже. i.e Если 'oldExchange' до вызова enrich имеет объект« A »в Body, то после вызова конечной точки HTTP, которая возвращает OutputStream. Затем последующие шаги должны иметь объект «C» (имеющий объект «A» и «Unmarshalled Object» B, полученный из Outputstream). Все это сейчас можно сделать только в 'AggregationStrategy'. API для обогащения не предоставить опцию для указания 'dataformat' для' newExchange'. Если бы объект «C» мог быть удален непосредственно из «newExchange» .. –

+0

Возможно, вам следует уточнить, что в вашем исходном сообщении в качестве утверждения: «Выход из HTTP Конечная точка возвращает ответ XML. Я бы хотел, чтобы это было упорядочено и установлено в теле нового обмена. »Заставляет поверить иначе. –

0

Просто используйте «direct: route» на uri и сделайте то, что вам нужно, с новым обменом на этом маршруте (услуга вызова, установить заголовки, данные без маршалла), полученный обмен будет получен как новый обмен в стратегии агрегации.

Смежные вопросы