2016-04-06 2 views
0

У меня есть маршрут, который должен обработать запрос от CXF конечной точки и возвращает результаты в формате JSON:Apache Camel - отправить расщепленные результаты CXF конечной

public class MyRoute extends RouteBuilder 
{ 

// ... Autowired: 
// msgRequestProcessor - converts json {string,string} to String of "\n" delimited json string: {string}\n{string} 
// RangeProcessor, SingleProcessor - create mongodb Criteria object from json string 
// msgTypeMapper - adds corresponding header "msg.type" 

@Override 
public void configure() 
{ 
    from("direct:list") 
      .process(msgRequestProcessor) 
      .split(body()) 
       .bean(msgTypeMapper.class) 
       .choice() 
        .when(header("msg.type").isEqualTo("single")) 
         .log("Go to direct:single") 
         .to("direct:single") 
        .otherwise() 
         .log("Go to direct:range") 
         .to("direct:daterange") 
      .end() 
      .to("direct:aggregate"); 

    from("direct:range") 
      .process(new RangeProcessor()); 

    from("direct:single") 
      .process(new SingleProcessor()); 

    from("direct:aggregate") 
      .aggregate(new MyAgg()).header("msg.collection").completionSize(2) 
      .log("RETVAL: ${body}") 
      .marshal().json(JsonLibrary.Gson).end(); 
} 

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

     Criteria oldCriteria = oldExchange.getIn().getBody(Criteria.class); 
     Criteria newCriteria = newExchange.getIn().getBody(Criteria.class); 

     Criteria criteria = new Criteria(); 
     criteria.andOperator(oldCriteria, newCriteria); 
     oldExchange.getIn().setBody(criteria.getCriteriaObject().toString()); 

     return oldExchange; 
    } 
} 

}

Все работает отлично, я вижу правильные результаты агрегации и завершение агрегации в журнале

но CXF конечная точка всегда возвращает вывод msgRequestProcessor (до раскола):

{"string"} 
{"string"} 

пока я ожидаю увидеть объект критериев, преобразованный в строку (что я вижу в журналах).

Любая помощь была бы высоко оценена! Благодарю.

+0

Где находится CXF в вашем маршруте? – Ralf

+0

@ Ralf У меня есть ресурс CXF, который перенаправляет запрос направить: конечная точка списка. – Savash

+1

По умолчанию сплиттер [возвращает исходный обмен] (http://camel.apache.org/splitter.html#Splitter-WhattheSplitterreturns). Поэтому неудивительно, что конечная точка CXF возвращает исходный запрос. Удивительный бит заключается в том, что ваш код агрегации имеет что угодно, чтобы агрегировать вообще. Вы уверены, что это так? – Ralf

ответ

1

Обратите внимание, что ваш отступ вводит в заблуждение, end() действительно является окончанием choice(), а не split(); Я был озадачен этим (как, например, @ Ralf).

Теперь агрегация работает, но ее результат отбрасывается, потому что результат разделения является входным сообщением.

Для запроса/ответ использования разветвителя (в выходе), вы действительно должны объявить стратегию агрегирования вместе с split()as explained here (таким же недостоверным отступом).

В официальной документации вы указываете, что ситуация наоборот (in-only): результат сплиттера отбрасывается, а результат агрегации маршрутизируется вниз по течению.

+0

Спасибо! Да, у вас там есть точка. Я добавил агрегацию в split(), еще один конец(), чтобы закрыть split(), и он работает. У вас есть идея, как я могу реализовать агрегацию внутри агрегации? Я имею в виду, мне нужно агрегировать сообщения по-разному, и я не вижу возможности использовать идентификатор корреляции здесь ... – Savash

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