Apache camel 阿帕奇骆驼&x27;s Aggregator2将XML文档聚合为单个大型文档

Apache camel 阿帕奇骆驼&x27;s Aggregator2将XML文档聚合为单个大型文档,apache-camel,Apache Camel,是否可以聚合多个小型XML文档: <doc><field name="XXX">fieldValue</field><doc> fieldValue 将aggregator2(camel 2.7.0)使用到一个大文档中 <result><doc>...</doc><doc>...</doc><doc>...</doc>...<doc>...</

是否可以聚合多个小型XML文档:

<doc><field name="XXX">fieldValue</field><doc>
fieldValue
将aggregator2(camel 2.7.0)使用到一个大文档中

<result><doc>...</doc><doc>...</doc><doc>...</doc>...<doc>...</doc></result>
。。。。。。。。。。。。。。。
不使用自定义聚合器处理器?我已经成功地创建了自定义聚合器,但现在我正在简化我的代码,所以如果camel支持开箱即用的话,我想把它去掉

我的自定义聚合器如下所示:

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
  }
}
docsaggegrator类实现处理器{
作废流程(交换){
def builder=DocumentBuilderFactory.newInstance().newDocumentBuilder()
def Document parentDoc=builder.parse(新的ByteArrayInputStream(“.toString().bytes));
def groupedExchanges=exchange.properties.find{it.key=='CamelGroupedExchange'}
groupedExchanges.value.each{Exchange x->
def Document Document=x.“in.”正文
def bos=new ByteArrayOutputStream()
TransformerFactory.newInstance().newTransformer().transform(新DOMSource(文档)、新StreamResult(bos))
def node=document.documentElement.childNodes.find{node it->it.nodeType==node.ELEMENT\u node}
def cloned=parentDoc.adoptNode(节点)
parentDoc.documentElement.appendChild(克隆)
}
exchange.in.body=parentDoc
}
}

自定义聚合器处理器,您是指自定义聚合策略?如果是这样的话,那么不,目前这是必需的


我们已经在路线图上为聚合提供了一个pojo模型,因此您不需要使用驼峰API。因此,希望这在将来变得更简单。

对于自定义聚合器处理器,您指的是自定义聚合策略?如果是这样的话,那么不,目前这是必需的


我们已经在路线图上为聚合提供了一个pojo模型,因此您不需要使用驼峰API。因此,希望将来这会更简单。

好的,您使用的是分组交换选项。那就有点不同了。数据作为属性以列表的形式存储在exchange上

您可以使用POJO并将参数绑定到属性,而不是处理器。但是该列表仍然包含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;
}
public Document mergeMyStuff(@Property(“CamelGroupedExchange”)列表分组){
文档父项=。。。
对于(int i=0;i
好的,您正在使用分组交换选项。那就有点不同了。数据作为属性以列表的形式存储在exchange上

您可以使用POJO并将参数绑定到属性,而不是处理器。但是该列表仍然包含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;
}
public Document mergeMyStuff(@Property(“CamelGroupedExchange”)列表分组){
文档父项=。。。
对于(int i=0;i
No我的自定义聚合器是一个接收分组交换的简单处理器。编辑了我的文章,将代码示例放在那里。没有,我的自定义聚合器是一个接收分组交换的简单处理器。编辑了我的文章,把代码示例放在那里。谢谢你的建议。这个解决方案看起来确实更好。我一直在使用它作为我自己(第一次)尝试聚合XML文档的指南。不幸的是,TypeConverter似乎不想转换我的XML,而是返回一个空对象。将类型更改为
String.class
将打印完整文档。谢谢您的建议。这个解决方案看起来确实更好。我一直在使用它作为我自己(第一次)尝试聚合XML文档的指南。不幸的是,TypeConverter似乎不想转换我的XML,而是返回一个空对象。将类型更改为
String.class
会打印完整文档。