Apache camel 阿帕奇骆驼&x27;s Aggregator2将XML文档聚合为单个大型文档
是否可以聚合多个小型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>...</
<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
会打印完整文档。