2015-01-21 33 views
2

原始消息我使用分离器拆分职位在单个消息。单个消息充满了一些数据。拆分后,我想将所有消息合并到一个。但是当我这样做时,我只能得到所有职位,而不是边界XML。我怎样才能得到在我的路由Splitter AggregateStrategy

我的XML:

<order> 
    <firstname>Max</firstname> 
    <lastname>Mustermann</lastname> 
    <positions> 
     <position> 
      <articlename>Article 1</articlename> 
      <amount>1</amount> 
     </position> 
     <position> 
      <articlename>Article 2</articlename> 
      <amount>2</amount> 
     </position> 
    </positions> 
</order> 

我的路线:

from("activemq:orders") 
    .split(body().tokenizeXML("POSITION",""), new AggregatePositionsStrategy()) 
     .enrich("direct:getArticleNumber", new addArticleNrToPositionStrategy()) 
    .end() 
    .to("file://c:/temp") 

的路线后,我的XML是:

 <position> 
      <articlenumber>654321</articlenumber> 
      <articlename>Article 1</articlename> 
      <amount>1</amount> 
     </position> 
     <position> 
      <articlenumber>123456</articlenumber> 
      <articlename>Article 2</articlename> 
      <amount>2</amount> 
     </position> 

新的数据被插入,但订单界丢失。我能做些什么来获取所有数据?

我AggregatePositionsStrategy的Splitter是:

public class AggregatePositionsStrategy implements AggregationStrategy { 
    public Exchange aggregate(Exchange exchange, Exchange response) { 

     if (exchange == null) { 
      return response; 
     } 

     if (exchange.getIn().getHeader("Artikelnummer") != null && exchange.getIn().getHeader("Artikelnummer").equals("Not Found")) { 
      exchange.getIn().setHeader("Artikelnummer", "Not Found"); 
     } 

     if (response.getIn().getHeader("Artikelnummer") != null && response.getIn().getHeader("Artikelnummer").equals("Not Found")) { 
      exchange.getIn().setHeader("Artikelnummer", "Not Found"); 
     } 

     String orders = exchange.getIn().getBody(String.class); 
     String newLine = response.getIn().getBody(String.class); 

     orders = orders + "\n" + newLine; 
     exchange.getIn().setBody(orders); 

     return exchange; 
    } 
} 

我知道,我只是人体的从劈裂邮件复制。但我不知道如何获得原始信息,以获取所有部分。你有好主意吗?

回答

0

我写我自己的处理器。骆驼内置方法很难解决这个问题。

谢谢你的帮助。

0

据我所知,当您使用splitter模式时,原始消息确实“丢失”。

您可以将其保存为交易所上的一个属性,稍后再次使用它来替换消息正文和更新的位置列表。

from("activemq:orders") 
    .setProperty("OriginalMessage", body()) 
    .split(body().tokenizeXML("POSITION",""), new AggregatePositionsStrategy()) 
     .enrich("direct:getArticleNumber", new addArticleNrToPositionStrategy()) 
    .end() 
    // set the positions on the "OriginalMessage" and set it to the body here 
    .to("file://c:/temp") 

或者,您可以保存“名字”和“姓氏”以交换属性并重新构建新的订单消息。

+0

如果我不使用AggregateStrategy。分割后我得到原始的消息体,但没有丰富的数据。 http://camel.apache.org/splitter.html#Splitter-WhattheSplitterreturns所以必须有原始的Message体到处 – Burner 2015-01-21 09:09:50

1

另一种选择: 你总是可以得到的路线的原体的UnitOfWork接口

.process(new Processor() { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     Message originalMessage = (Message) 
       exchange.getUnitOfWork().getOriginalInMessage(); 

     (do something...) 
    }  
})