2016-06-28 2 views
1

У меня есть приложение Camel, и я пытаюсь выполнить некоторую агрегацию на основе некоторых результатов из разных ответов (веб-службы REST).Агрегация верблюдов с маршрутами REST

Это то, что я до сих пор (маршруты Camel):

@Component 
public final class AggregationRoute extends RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
    rest("/aggregation") 
     .get() 
     .to("direct:retrieve"); 

    from("direct:retrieve") 
     .multicast(/*new BodyAggregationStrategy(), true*/) 
     .to("direct:foo") 
     .to("direct:foo1"); 

    from("direct:foo") 
     .to("seda:http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?sector=conus") 
     .to("direct:aggregate"); 

    from("direct:foo1") 
     .to("seda:http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?sector=conus") 
     .to("direct:aggregate"); 

    from("direct:aggregate") 
     .aggregate(header("id"), new BodyAggregationStrategy()) 
     .log(LoggingLevel.WARN, simple("${body}").getText()); 
    } 
} 

... "агрегация стратегии"

public final class BodyAggregationStrategy implements AggregationStrategy { 
    @Override 
    public Exchange aggregate(final Exchange oldExchange, final Exchange newExchange) { 
    if (null == oldExchange) { 
     return newExchange; 
    } 

    String oldBody = oldExchange.getIn().getBody(String.class); 
    String newBody = newExchange.getIn().getBody(String.class); 

    oldExchange.getIn().setBody(oldBody + "+" + newBody); 
    return oldExchange; 
    } 
} 

... в конце концов, веб-службы собираются быть другим, но я просто пытаюсь теперь увидеть, смогу ли я сначала решить эту основную проблему.

Я определил конечную точку REST, когда GET /aggregation ударил (по мою сторону), я хочу проконсультироваться с двумя или более REST веб-служб и агрегировать ответ от тех, затем «ответьте» назад.

Любые подсказки?

+1

Посмотрите на шаблон Scatter-Gather https://camel.apache.org/scatter-gather.html – ltsallas

+0

Я согласен с обоими @Itsallas & Claus, если ваши вызовы отдыха будут последовательными, тогда подумайте о сохранении каждого ответов в заголовке/свойстве, а затем агрегировать значения с использованием простого процессора. – gnanagurus

ответ

3

Многоадресный EIP имеет встроенный агрегатор, поэтому настройте стратегию агрегации на этом шаблоне вместо использования отдельного агрегатора. Это гарантирует, что сообщения чередуются и объединяются как часть того же единицы работы, и результат может быть видимым и отправить обратно вызывающему клиенту REST.

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