【发布时间】:2014-01-22 21:17:29
【问题描述】:
我看到这个问题已经被问过很多次了,但没有一个帖子有帮助,也没有一个决定性的解决方案。我正在拆分一条消息,然后使用 Aggregator2 对其进行聚合。代码抛出异常,因为 oldExchange 始终为空。所以为了测试我设计了一个小代码。
我读了一个订单,xml文件,看起来像这样
<Orders xmlns="http://some/schema/Order">
<Order>
<orderNum>1</orderNum>
</Order>
<Order>
<orderNum>2</orderNum>
</Order>
<Order>
<orderNum>3</orderNum>
</Order>
<Order>
<orderNum>5</orderNum>
</Order>
<Order>
<orderNum>6</orderNum>
</Order>
我的骆驼上下文看起来像这样
<camel:route>
<camel:from uri="file:src/data/catask/test?noop=true"/>
<camel:log message="${body}"></camel:log>
<camel:split>
<camel:xpath>//te:Orders/*</camel:xpath>
<camel:to uri="direct:logQueries"/>
<camel:to uri="direct:aggegateQueries"/>
</camel:split>
</camel:route>
<camel:route>
<camel:from uri="direct:logQueries"/>
<camel:log message="After the call : \n ${body}"></camel:log>
</camel:route>
<camel:route>
<camel:from uri="direct:aggegateQueries"/>
<camel:aggregate strategyRef="aggrTask" completionInterval="8000" >
<camel:correlationExpression>
<camel:xpath>//te:Order</camel:xpath>
</camel:correlationExpression>
<camel:to uri="file:src/data/catask/output?fileName=output.xml"/>
</camel:aggregate>
</camel:route>
我的聚合策略类看起来像这样
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
System.out.println("Returning new exchange");
return newExchange;
}
String oldBody = oldExchange.getIn().getBody(String.class);
String newBody = newExchange.getIn().getBody(String.class);
oldExchange.getIn().setBody(oldBody + "+" + newBody);
return oldExchange;
}
问题在于,当聚合结果保存在 output.xml 文件中时,它只包含从 Orders.xml 读取的最后一条记录。
即
<Order xmlns="http://some/schema/Order">
<orderNum>6</orderNum>
</Order>
我进一步调查并发现这是因为在第一次调用之后 oldExchange 应该有一些值,但事实证明它始终为空。我认为因为它是从单个文件中读取所有内容并将其拆分,所以只有交换。
>有什么建议吗?
更新 1: Per Claus 我只能使用 Splitter 来解决这个问题。我这样做了,并且能够成功加入所有消息。但是我仍在寻找一种使用 Aggregator2 的方法。这里我是如何只使用 Splitter 的。
camel:route>
<camel:from uri="file:src/data/catask/test?noop=true"/>
<camel:log message="${body}"></camel:log>
<camel:split strategyRef="aggrTask">
<camel:xpath>//te:Orders/*</camel:xpath>
<camel:to uri="direct:logQueries"/>
<
</camel:split>
</camel:route>
<camel:route>
<camel:from uri="direct:logQueries"/>
<camel:log message="After the call : \n ${body}"></camel:log>
</camel:route>
【问题讨论】:
-
还发布在 Camel 用户邮件列表中,正在讨论它 - camel.465427.n5.nabble.com/…
标签: java spring apache-camel