分散收集(克隆+聚合)不起作用

Posted

技术标签:

【中文标题】分散收集(克隆+聚合)不起作用【英文标题】:Scatter-Gather (Clone+Aggregate) not working 【发布时间】:2019-09-08 14:37:53 【问题描述】:

我正在尝试使用克隆调用两个端点并收集它们的信息以通过聚合发送,我必须将它与分散收集中介一起使用。每个端点都以 json 格式返回一个字符串。但我一直有一个“期望 SOAP 信封作为父级的实现”错误。我的最后一次尝试如下。 我应该在 onComplete 表达式中使用什么来完成这项工作?

<resource methods="GET" uri-template="/allInfo">
        <inSequence>
            <log description="Get All Restaurants Info" level="custom" separator=",">
                <property name="message" value="&quot;All information of restaurants&quot;"/>
            </log>
            <clone description="All Info" id="ScatterGatherProxy">
                <target>
                    <endpoint key="RestaurantLocalsEP"/>
                </target>
                <target>
                    <endpoint key="RestaurantNamesEP"/>
                </target>
            </clone>
        </inSequence>
        <outSequence>
            <aggregate id="ScatterGatherProxy">
                <completeCondition>
                    <messageCount max="-1" min="-1"/>
                </completeCondition>
                <onComplete expression="fn:concat('//*')">
                    <send/>
                </onComplete>
            </aggregate>
        </outSequence>
        <faultSequence/>
    </resource>

【问题讨论】:

能否提供 RestaurantLocalsEP 和 RestaurantNamesEP 端点定义?它们是 HTTP 端点吗? 【参考方案1】:

聚合中介包含来自最新版本 (6.5.0) 的原生 JSON 支持(即将发布) 此外,通过 WUM 更新为 EI 6.1.1 和 6.4.0 提供 JSON 支持。

您可以使用以下示例配置

<api xmlns="http://ws.apache.org/ns/synapse" name="aggregate"
context="/testAgg">    <resource methods="POST GET">
       <inSequence>
          <log level="custom" separator=",">
             <property name="message" value="&quot;All information of restaurants&quot;"/>
          </log>
          <clone id="ScatterGatherProxy">
             <target>
                <endpoint name="Cape">
                   <address uri="http://www.mocky.io/v2/5befbf782f000067007a0be4" format="get"/>
                </endpoint>
             </target>
             <target>
                <endpoint name="KSC">
                   <address uri="http://www.mocky.io/v2/5befbfd22f00009a007a0be5" format="get"/>
                </endpoint>
             </target>
          </clone>
       </inSequence>
       <outSequence>
          <aggregate id="ScatterGatherProxy">
             <completeCondition>
                <messageCount min="-1" max="-1"/>
             </completeCondition>
             <onComplete expression="json-eval($)">
                <send/>
             </onComplete>
          </aggregate>
       </outSequence>    </resource> </api>

您可以在https://lahirumadushankablog.wordpress.com/2018/11/17/aggregating-json-payloads-in-wso2-ei/阅读更多信息

【讨论】:

嗨@Lahiru,在 WSO2 EI 6.1.1 中我们如何实现这个聚合表达式部分。正如我之前在这篇文章中提到的那样,这不起作用。任何想法将不胜感激?【参考方案2】:

您需要添加一个 enclosureElementProperty 标记以将所有输出收集到一个完整的条件中。

例如你可以尝试如下

<property name="Aggregated_Responses" scope="default">
    <jsonObject/>
</property>
<aggregate id="NIRO">
<completeCondition>
    <messageCount min="-1" max="-1"/>
</completeCondition>
<onComplete xmlns:ns="http://org.apache.synapse/xsd" expression="$body/*[1]"
            enclosingElementProperty="Aggregated_Responses">
    <send/>
</onComplete>
</aggregate>

谢谢

【讨论】:

嗨@Nirothipan,$body/*[1] 中的 aggragete 表达式在 WSO2 EI 6.1.1 中不起作用。得到类似“forceExpand:错误解析元素jsonObject的数据源文档”的异常。

以上是关于分散收集(克隆+聚合)不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 github 克隆的项目。 heroku 不起作用

jquery UI 自动完成:我克隆的自动完成字段不起作用

克隆的 Select2 在 Asp.Net 中不起作用

日期范围在聚合管道中不起作用,但在 find() 中起作用

通过 Nginx 代理为 Gitlab 服务器克隆的 Git 不起作用

JQuery可拖动:使用助手时滚动不起作用:使用克隆