WSO2 MI 4.0.0中Iterator结合Aggregate Mediator失效问题求助
WSO2 MI 4.0.0 Iterator+Aggregate 聚合失效问题排查与解决
问题现象
Iterator内日志输出正常,但Aggregate的onComplete块无日志输出,修改continueParent为false也无法触发聚合完成逻辑。
核心问题分析
- Iterator遍历目标错误:原表达式
//Customers匹配的是外层数组节点,仅会迭代1次,而非每个Customer对象,导致聚合无足够消息触发完成条件。 - JSON格式非法:Payload Factory中DOJ字段未添加引号,生成的JSON不符合规范,影响聚合消息的识别。
- 逻辑执行顺序错误:聚合未完成时就执行后续Payload Factory和日志逻辑,此时聚合结果尚未写入上下文。
修正方案
1. 修正Iterator遍历表达式
将遍历表达式改为//Customers/*/*,定位到最内层的每个Customer对象,确保每个对象都被迭代处理。
2. 修复Payload Factory的JSON格式
给DOJ字段添加引号,保证生成的JSON合法:
{ "NAME": "$1", "DOJ": "$2" }
3. 调整聚合后逻辑位置
将聚合后的Payload Factory、日志逻辑移至onComplete块内,确保只有聚合完成后才处理结果。
4. 优化Aggregate配置
设置aggregateElementType="array",明确聚合为数组结构,同时调整expression为json-eval($)确保正确提取每个子消息的JSON内容。
修正后的完整序列代码
<?xml version="1.0" encoding="UTF-8"?> <sequence name="AGGREGATE_CHECK" trace="disable" xmlns="http://ws.apache.org/ns/synapse"> <iterate continueParent="true" expression="//Customers/*/*" id="line-Item-Iterator" sequential="true"> <target> <sequence> <property expression="//Name" name="Name" scope="default" type="STRING"/> <property expression="//DOJ" name="Doj" scope="default" type="STRING"/> <payloadFactory media-type="json"> <format>{ "NAME": "$1", "DOJ": "$2" }</format> <args> <arg evaluator="xml" expression="$ctx:Name"/> <arg evaluator="xml" expression="$ctx:Doj"/> </args> </payloadFactory> <log level="full"/> </sequence> </target> </iterate> <log> <property name="after iterator" value="waiting for aggregation"/> </log> <aggregate id="line-Item-Iterator"> <completeCondition> <messageCount max="-1" min="-1"/> </completeCondition> <onComplete aggregateElementType="array" expression="json-eval($)"> <property expression="$body/*" name="response" scope="operation" type="OM"/> <log level="full" category="INFO"> <property name="Aggregation_Complete" value="true"/> </log> <payloadFactory media-type="json"> <format>$1</format> <args> <arg evaluator="xml" expression="get-property('operation','response')"/> </args> </payloadFactory> <log> <property expression="$body/*" name="Final_Aggregated-response"/> </log> </onComplete> </aggregate> </sequence>
测试验证
- 输入Payload:
{ "data": { "level": "asss", "Info": { "Customers": [ [ { "Name": "Ram", "Age": 26, "city": "TX", "DOJ": "26-06-2002" }, { "Name": "Shri", "Age": 29, "city": "TX", "DOJ": "12-06-1999" }, { "Name": "Reena", "Age": 25, "city": "TX", "DOJ": "22-06-2007" } ] ] } }, "ms": {} }
- 期望输出:
[ { "NAME": "Ram", "DOJ": "26-06-2002" }, { "NAME": "Shri", "DOJ": "12-06-1999" }, { "NAME": "Reena", "DOJ": "22-06-2007" } ]
内容的提问来源于stack exchange,提问作者sathish Sankarzz
相关产品推荐
相关产品推荐

