WSO2 ESB如何在不使用send/call mediator时使用Aggregate Mediator
解决方案
根本原因:Iterate Mediator的子分支中,只有经过Call/Send Mediator返回的后端响应会自动进入响应流,被外层Aggregate Mediator识别并捕获;自行构造的消息默认停留在入站流中,无法被Aggregate检测到,因此不会触发聚合逻辑。
正确修改方案
不需要额外定义独立的AggregateSequence,仅需修改Switch的default分支逻辑,构造自定义响应后将消息流转到响应流即可,具体调整如下:
- 构造自定义响应payload后,添加
RESPONSE属性标记当前消息为响应 - 使用
loopbackmediator将当前消息从入站流转到出站流,即可被外层的Aggregate Mediator正常捕获
修改后的default分支代码
<default> <log> <property name="default" value="defaultCase"/> </log> <payloadFactory media-type="json"> <format>{ "sub1":"My own Response" }</format> <args/> </payloadFactory> <!-- 标记为响应消息 --> <property name="RESPONSE" scope="default" type="STRING" value="true"/> <!-- 流转到出站流,触发外层aggregate捕获 --> <loopback/> </default>
完整可运行API代码
<?xml version="1.0" encoding="UTF-8"?> <api context="/propertycheck" name="propertyCheck" xmlns="http://ws.apache.org/ns/synapse"> <resource methods="POST"> <inSequence> <iterate attachPath="json-eval($)" expression="json-eval($.main)" id="testingid" preservePayload="true" sequential="true"> <target> <sequence> <switch source="json-eval($.sub1)"> <case regex="a"> <log level="full" separator=","/> <call> <endpoint> <http method="post" uri-template="http://localhost:3000/test"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>1</progressionFactor> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> </http> </endpoint> </call> </case> <case regex="b"> <log level="full" separator=","/> <call> <endpoint> <http method="post" uri-template="http://localhost:3000/test"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>1</progressionFactor> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> </http> </endpoint> </call> </case> <case regex="c"> <log level="full" separator=","/> <call> <endpoint> <http method="post" uri-template="http://localhost:3000/test"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>1</progressionFactor> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> </http> </endpoint> </call> </case> <default> <log> <property name="default" value="defaultCase"/> </log> <payloadFactory media-type="json"> <format>{ "sub1":"My own Response" }</format> <args/> </payloadFactory> <property name="RESPONSE" scope="default" type="STRING" value="true"/> <loopback/> </default> </switch> </sequence> </target> </iterate> <log/> <aggregate id="testingid"> <correlateOn expression="json-eval($)"/> <completeCondition> <messageCount max="-1" min="-1"/> </completeCondition> <onComplete aggregateElementType="root" expression="json-eval($)"> <log> <property expression="json-eval($)" name="outout"/> </log> </onComplete> </aggregate> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
验证说明
使用提供的测试请求发起调用时,4个数组元素分别处理:
- sub1为a/b/c的3条请求调用外部接口返回响应
- sub1为d的1条请求返回自定义构造的响应
所有4条响应都会被外层Aggregate捕获,聚合完成后统一返回。
内容的提问来源于stack exchange,提问作者Girish
相关产品推荐
相关产品推荐

