拆分apache camel后恢复头值

q3aa0525  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(186)

我有一个xml,我使用split标记在Spring DSL中进行处理。我所做的基本上是在xml中搜索一个值,当我找到这个值时,我需要获得另一个标记的值,同一元素的子元素,并保存到一个标头中。这个操作看起来很简单,但我无法恢复split之外的标头,我需要这样做。我尝试了标头和属性,结果是一样的。
请帮我找出我做错了什么。
代码示例:

<route>
...
<split>
    <xpath>//FatherTag/ChildTag</xpath>
    <to uri="direct:processingRoute"/>
</split>

</route>

<route>
<from uri="direct:processingRoute"/>
<choice>
<when>
<simple>....</simple>
    <setHeader headerName="foo">
        <constant>test</constant>
    </setHeader>
</when>
</choice>

</route>
2exbekwf

2exbekwf1#

您需要定义一个AggregationStrategy。从Camel Splitter

拆分器返回的内容
Camel 2.3及更高版本

默认情况下,拆分器将返回原始输入消息。

适用于所有版本

您可以通过将自己的策略作为AggregationStrategy提供来覆盖此策略。
您的AggregationStrategy需要检查每个子标记的相应标头集,并将其传递到拆分操作的结果Exchange输出邮件上。

qoefvg9y

qoefvg9y2#

要保留拆分函数内部设置的头或属性,需要使用聚合策略,如果其简单头且需要避免聚合策略,则在拆分函数之前设置一个交换属性,并将ArrayList作为值

List<String> list = new ArrayList<>();     
list.add("one");    
exchange.setProperty("list", list);

现在在拆分功能内如果您再次用列表中的另一个项目更新此属性,则您将能够在拆分功能结束后检索它,并且它将在每个拆分交换机和父交换机中可用。

from("direct:main)   
.split(body())  
.to("direct:sub")  
.end().process(ex -> {
System.Out.Println(ex.getProperty("list"));
}).end();

from("direct:sub")  
.process(ex -> {  
List list = exchange.getProperty(list);  
list.add("two");  
exchange.setProperty(list);  
}).end();

输出:[一,二]

相关问题