2014-01-16 101 views
5

以下是我正在嘗試的操作。我要讀有此內容的兩個文件Apache Camel合併來自不同路由的兩個文件

<Person> 
<Requestor>Dinesh</Requestor> 
</Person> 

要做到這一點我創建了一個路線

<route id="getPerson"> 
    <from uri="file:src/main/resources/xml?noop=true"/> 
    </route> 

接下來,我需要閱讀被叫地址另一個文件

<Address> 
    <City>New York </City> 
</Address> 

這裏是我的第二條路線

<route id="getAddress"> 
    <from uri="file:src/main/resources/xmlAddress?noop=true"/> 
    </route> 

我如何這兩個XML合併到一個使用富集或聚合,使最終的XML消息看起來像這樣

<Person> 
    <Requestor>Dinesh</Requestor> 
    <Address> 
    <City>New York</City> 
    </Address> 
</Person> 

任何想法?我試着按照文檔,但它所說的是發送到一些Web服務的URI。

上面的場景是淡化了我真正想要做的事情。對我來說,真實生活中的情況是這樣做的 - 第1步。讀取一個xml文件, 第2步:調用Web服務並獲取響應。 第3步:合併步驟2的響應和在步驟添加它öXML主體1

EDIT 1:我可以寫自定義AggregatorStartegy類。我寫了這樣的事情

public class AggregationStrategy implements org.apache.camel.processor.aggregate.AggregationStrategy{ 

@Override 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    newExchange.getOut().setBody("<all>" 
       + oldExchange.getIn().getBody(String.class) 
       + newExchange.getIn().getBody(String.class) 
       + "</all>"); 
      return newExchange; 
} 

    } 

什麼我掙扎是怎麼寫的寫的Spring XML,我可以告訴這是我的郵件或文件1+消息或文件2,去加入他們的行列。這裏是我的實際context.xml中看起來像

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring"> 
<route> 
    <from uri="file:src/main/resources/xmlPerson?noop=true"/> 

    <camel:to uri="direct:enrichMessage"></camel:to> 
</route> 
<route > 
    <from uri="file:src/main/resources/xmlAddress?noop=true"/> 
    <log message="**************RESPONSE FROM CATASK DSS:: \n ${body}" id="log_output"/> 
    <camel:to uri="direct:enrichMessage"></camel:to> 

</route> 
<route id="enrichMessage"> 
    <from uri="direct:enrichMessage"/> 
    <camel:enrich strategyRef="aggregationBean" /> 
    <log message="**************MERGED RESPONSE :: \n ${body}"/> 
</route> 

+0

那麼究竟哪裏web服務來發揮作用? – Ralf

+0

例如.enrich(「http://serviceA.com?xxx」).enrich(「http:// serviceB?xx」)。這是一個例子。 http://www.andrejkoelewijn.com/blog/2010/06/13/a-composite-rest-service-using-camel/。不管我得到什麼解決方案,我只需要將兩個文件或兩個消息合併爲一個。我實際上修改了這個帖子來解釋我的描述。我的實際情況是 - 第1步。讀取xml文件,第2步:調用Web服務並獲取響應。步驟3:合併步驟2中的響應並將其添加到步驟1中的Xml體中。 –

+0

編輯了問題標題。 –

回答

5

我終於想通了。我最初的理解是,我們可以在手有兩個消息,並把它們合併防爆 - 路線1個最後的消息 -

迪內希

2號線最後一條消息 -

<Address> 
    <city>New York</city> 
</Address> 

我的理解是在上述兩條消息之後,我可以構建一個aggregationStartegy並將它們合併。那麼我的假設是錯誤的。豐富的工作方式是,它有一條信息,並且在它從第二條路線得到消息之前,我們需要告訴駱駝 - 「在你收到消息之前,嘿,路由2,這裏是路由1的消息。當你獲​​取從1號線的消息,用我的聚合策略類合併它們。「」

所以,我期待下出使用濃縮塔

<Person> 
    <name>Dinesh</name> 
</Person> 
<Address> 
    <city>New York</city> 
</Address> 

之後,但我不知道該怎麼做。下面是我在做什麼,這是錯誤的做法

<route id="getPerson"> 
<from uri="file:src/data/catask/person?noop=true" /> 
<to uri="direct:enrich"/> 
</route> 

<route id="getAddress"> 
<from uri="file:src/data/catask/address?noop=true" /> 
<to uri="direct:enrich"/> 
</route> 

<route id="enrich"> 
<from uri="direct:enrich"/> 
<enrich strategyRef="aggregationBean"/> 
<log message="After Merge ... ${body}"/> 
</route> 

<bean id="aggregationBean" class="com.mycompany.camel.canadatask.AggregationStrategy"/> 

我的Java類看起來像這樣

public class AggregationStrategy implements 
    org.apache.camel.processor.aggregate.AggregationStrategy{ 



@Override 
public Exchange aggregate(Exchange message,Exchange resource) { 
    String old = resource.getIn().getBody(String.class); 
    System.out.println("OLD:: \n"+old); 
    String newMsg = message.getIn().getBody(String.class); 
    System.out.println("NEW:: \n"+newMsg); 
    System.out.println("MERGED::" + old + newMsg); 
    message.getIn().setBody(old+newMsg); 
      return message; 
} 

    } 

現在當然上面的代碼沒有工作。後來我意識到這個錯誤,我對濃縮劑的理解是錯誤的。

正確的實現是這樣的 -

<route id="getPerson"> 
    <from uri="file:src/data/catask/person?noop=true" /> 
    <pollEnrich strategyRef="aggregationBean" uri="file:src/data/catask/address?noop=true"/> 
    <log message="After Merge ... ${body}"/> 
</route> 

<bean id="aggregationBean" class="com.mycompany.camel.canadatask.AggregationStrategy"/> 

Java代碼保持不變 -

public class AggregationStrategy implements 
    org.apache.camel.processor.aggregate.AggregationStrategy{ 



@Override 
public Exchange aggregate(Exchange message,Exchange resource) { 
    String old = resource.getIn().getBody(String.class); 
    System.out.println("OLD:: \n"+old); 
    String newMsg = message.getIn().getBody(String.class); 
    System.out.println("NEW:: \n"+newMsg); 
    System.out.println("MERGED::" + old + newMsg); 
    message.getIn().setBody(old+newMsg); 
      return message; 
} 

    } 
相關問題