2016-04-06 16 views
0

Ben CXF uç noktadan isteği işlemek ve JSON olarak sonuç gerekir bir rota:Apache Camel - CXF bitiş noktasına bölünmüş sonuçları göndermek

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

}

Her şey, ben doğru toplama sonuçlarını da görüyorum işleri ve günlük agregasyon tamamlanması

ancak CXF nokta her zaman msgRequestProcessor çıkışını verir (split önce):

{"string"} 
{"string"} 

Kritere dönüştürülen Kriteri nesnesini görmeyi beklerken (günlüklerde görebiliyorum).

Herhangi bir yardım çok takdir edilecektir! Teşekkürler.

+0

Rotanızda CXF nerede bulunur? – Ralf

+0

@Ralf Yönlendirmeyi yönlendiren CXF kaynağım var: liste bitiş noktası. – Savash

+1

Varsayılan olarak splitter [orijinal değişimi döndürür] (http://camel.apache.org/splitter.html#Splitter-WhattheSplitterreturns). Bu yüzden CXF uç noktanızın orijinal isteği geri alması şaşırtıcı değil. Şaşırtıcı olan bit, toplama kodunuzun bir araya toplanması gereken bir şey olmasıdır. Yaptığından emin misin? – Ralf

cevap

1

İlk önce girintinizin yanıltıcı olduğunu not edin, end() gerçekten choice()'un sonudur ve split(); Bu arada bir şaşkınlık yaşadım (@Ralf belki de olabilirdi.)

Şimdi, toplama bir şekilde çalışır, ancak sonucu, aslında bölünmenin sonucu giriş mesajı olduğundan atılır. Bir istek için

/, gerçekten split() as explained here (aynı yanıltıcı girinti) ile birlikte toplama stratejisi beyan etmek zorunda (in-out ) splitter kullanımını cevap. splitter sonucu atılır ve toplanmasının sonucu aşağı yönlendirilir: Sözünü resmi belgelerinde

durum tersi (yılında yalnızca) 'dir.

+0

Teşekkür ederiz! Evet, orada bir nokta var. Split(), bir tane daha son(), split() 'ı kapatmak için toplama ekledim ve çalışır. Bir kümelenme içinde bir kümelenmeyi nasıl uygulayabilirim? Mesajları farklı şekilde birleştirmem gerekiyor ve korelasyon kimliğini burada kullanmak için bir seçenek göremiyorum. – Savash

İlgili konular