You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 ESB如何在不使用send/call mediator时使用Aggregate Mediator

解决方案

根本原因:Iterate Mediator的子分支中,只有经过Call/Send Mediator返回的后端响应会自动进入响应流,被外层Aggregate Mediator识别并捕获;自行构造的消息默认停留在入站流中,无法被Aggregate检测到,因此不会触发聚合逻辑。


正确修改方案

不需要额外定义独立的AggregateSequence,仅需修改Switch的default分支逻辑,构造自定义响应后将消息流转到响应流即可,具体调整如下:

  1. 构造自定义响应payload后,添加RESPONSE属性标记当前消息为响应
  2. 使用loopback mediator将当前消息从入站流转到出站流,即可被外层的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:45:02