在JBoss Fuse 6.3与Apache Camel 2.17中拆分JSON数组并分组
在JBoss Fuse 6.3(Apache Camel 2.17)的Spring DSL中拆分JSON数组为固定大小分组
你要实现的需求很清晰:把包含9个国家对象的JSON数组拆成每2个一组(最后一组1个),且消息顺序无关。你的split+aggregate思路完全正确,只是需要把聚合策略配置到位,我来给你补全正确的Spring DSL代码:
首先,先定义GroupedExchangeAggregationStrategy的Bean,这个策略会把聚合的消息体收集成列表,正好匹配你需要的数组格式:
<bean id="groupedExchangeStrategy" class="org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy"/>
然后是完整的路由配置:
<route id="split-and-aggregate-countries"> <from uri="direct:processCountries"/> <!-- 拆分JSON数组的每个元素,流式处理适合大数据量场景 --> <split streaming="true"> <!-- JsonPath表达式遍历数组的每一项,拆分出单个国家对象 --> <jsonpath>$[*]</jsonpath> <!-- 聚合拆分后的消息:每2条聚合一次,超时1秒确保最后一组能触发 --> <aggregate completionSize="2" completionTimeout="1000" strategyRef="groupedExchangeStrategy"> <!-- 聚合完成后处理消息,这里用log输出示例,可替换为下游端点 --> <log message="聚合后的分组消息: ${body}"/> <!-- <to uri="your-downstream-endpoint"/> --> </aggregate> </split> </route>
关键配置说明:
<jsonpath>$[*]</jsonpath>:这是你原来配置的小疏漏,这个表达式会遍历输入的JSON数组,把每个国家对象拆成单独消息;如果用$会把整个数组作为一个拆分项,达不到拆分单个元素的效果completionSize="2":指定每收集2条消息就完成一次聚合,生成包含2个国家对象的数组completionTimeout="1000":设置1秒超时,确保最后剩下的1条消息不会一直等待,超时后自动完成聚合strategyRef="groupedExchangeStrategy":引用我们定义的聚合策略,它会把聚合的消息体合并成列表,正好对应你要的JSON数组格式
效果验证:
输入你提供的9个国家的JSON数组后,这个路由会生成5条输出消息:
- 前4条消息各包含2个国家对象
- 第5条消息包含最后1个国家对象
完全符合你的预期输出格式。
小提示:如果你的JSON数组数据量不大,可以去掉streaming="true",非流式处理在小数据量下更高效;如果数据量很大,流式处理能避免内存溢出问题。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

