2011-04-28 58 views
1

这有可能聚合多个小型XML文档:Apache的骆驼的Aggregator2 XML文档合并为一个巨大的文件

<doc><field name="XXX">fieldValue</field><doc> 

使用aggregator2(骆驼2.7.0)组合成一个大文件

<result><doc>...</doc><doc>...</doc><doc>...</doc>...<doc>...</doc></result> 

没有使用一些自定义聚合器处理器?我已经设法完成了创建自定义聚合器的工作,但现在我正在简化我的代码,所以如果骆驼支持开箱即用,那么我们就可以摆脱它。

我的自定义聚合的样子:

class DocsAggregator implements Processor { 
    void process(Exchange exchange) { 

    def builder = DocumentBuilderFactory.newInstance().newDocumentBuilder() 
    def Document parentDoc = builder.parse(new ByteArrayInputStream("<?xml version='1.0'?><add></add>".toString().bytes)); 
    def groupedExchanges = exchange.properties.find {it.key == 'CamelGroupedExchange'} 

    groupedExchanges.value.each { Exchange x -> 
    def Document document = x.'in'.body 

    def bos = new ByteArrayOutputStream() 
    TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(bos)) 
    def node = document.documentElement.childNodes.find { Node it -> it.nodeType == Node.ELEMENT_NODE} 
    def cloned = parentDoc.adoptNode(node) 
    parentDoc.documentElement.appendChild(cloned) 
    } 
    exchange.in.body = parentDoc 
    } 
} 

回答

4

好,所以你使用分组交换选项。然后它有点不同。数据以列表形式存储在交易所中。

除了处理器,您可以使用POJO并将参数绑定到属性。但是List仍然包含Exchange对象,因此您需要调用其上的getIn()。getBody()方法。但是如果你这样做,你不需要在POJO中导入任何Camel API。

public Document mergeMyStuff(@Property("CamelGroupedExchange") List grouped) { 

    Document parent = ... 
    for (int i = 0; i < grouped.size; i++) { 
     Document doc = list.get(i).getIn().getBody(Documemt.class); 
     .. add to parent doc 
    } 

    return parent; 
} 
+0

感谢您的建议。这个解决方案真的看起来更好 – Archer 2011-04-29 09:31:55

+0

我一直在用这个作为我自己的(第一次)聚合XML文档的指导。不幸的是,它看起来像TypeConverter不想转换我的XML,而是返回一个空对象。将类型更改为'String.class'确实打印完整的文档。 – Lilienthal 2013-05-06 11:42:39

1

由自定义聚合处理器,你说的是自定义的AggregationStrategy?如果是这样的话,那么不。目前这是必需的。

我们已经在路线图上提供了聚合的pojo模型,因此您不需要使用该骆驼API。所以期待这在未来会更简单。

+0

没有我的自定义聚合器是接收分组交换的简单处理器。编辑我的文章,将代码示例放在那里。 – Archer 2011-04-28 18:00:48