【问题标题】:aggregating responses using wso2 esb api: no answer使用 wso2 esb api 聚合响应:没有答案
【发布时间】:2014-10-31 14:52:11
【问题描述】:

在 WSO2 ESB 中,我创建了一个 rest API。此 API 需要连接到两个不同的服务,并结合结果。

为此,我使用了一个 API,其中依次包含一个发送适当消息的克隆中介。这很好用。

接下来,我使用记录器查看传入的消息。两者都是 json 并且可以返回。然后我想使用聚合调解器将两者结合起来。有了这个,我有两个问题:

  • 当使用 rootElementProperty 将两个项目放在一个父项下时,会发生 NPE,
  • 当使用丰富的中介或其他任何东西来发出正确的消息并以 send 结尾时,生成的消息永远不会发回。

这可能是什么原因?

这是实际的 API:

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="Cale-StreetsAPI" context="/Cale-StreetsAPI">
    <resource methods="GET" uri-template="/getStreets?lat={lat}&amp;lon={lon}&amp;radius={radius}">
        <inSequence>
            <property name="aggRoot" scope="default">
                <red:jsonObject xmlns:red="redora"/>
            </property>
            <log description="">
                <property name="lat" expression="get-property('uri.var.lat')"/>
                <property name="lon" expression="get-property('uri.var.lon')"/>
                <property name="radius" expression="get-property('uri.var.radius')"/>
            </log>
            <clone continueParent="true" id="deCartaStreets">
                <target>
                    <sequence>
                        <sequence key="DeCartaDDS"/>
                    </sequence>
                </target>
                <target>
                    <sequence>
                        <sequence key="DeCartaReverseGeo"/>
                    </sequence>
                </target>
            </clone>
        </inSequence>
        <outSequence>
            <property name="messageType" value="application/xml" scope="axis2" type="STRING" description="messageType"/>
            <log level="full" description="">
                <property name="WSANSWER" value="true"/>
            </log>
            <aggregate>
                <completeCondition>
                    <messageCount min="2" max="-1"/>
                </completeCondition>
                <onComplete expression="$body/jsonObject">
                    <enrich>
                        <source clone="true" xpath="$body//jsonObject"/>
                        <target type="property" property="ResultItems"/>
                    </enrich>
                    <log level="custom">
                        <property name="ResultItems" expression="get-property('ResultItems')"/>
                    </log>
                    <enrich>
                        <source type="inline" clone="true">
                            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                                <soapenv:Header/>
                                <soapenv:Body>
                                    <JsonResponse xmlns="dummy"/>
                                </soapenv:Body>
                            </soapenv:Envelope>
                        </source>
                        <target type="envelope"/>
                    </enrich>
                    <enrich>
                        <source type="property" clone="true" property="ResultItems"/>
                        <target xmlns:red="dummy" action="child" xpath="//red:JsonResponse"/>
                    </enrich>
                    <log level="full" description="">
                        <property name="AGGREGATE_END" value="true"/>
                    </log>
                    <property name="messageType" value="application/json" scope="axis2" type="STRING" description="messageType"/>
                    <send/>
                </onComplete>
            </aggregate>
        </outSequence>
        <faultSequence>
            <log level="full" category="WARN"/>
        </faultSequence>
    </resource>
</api>

【问题讨论】:

    标签: json rest wso2 esb


    【解决方案1】:

    我遇到了和你一样的问题。根据互联网上的帖子数量,API 不支持聚合。

    所以我的解决方案是引入聚合代理服务,它完成了 API 刚刚调用该代理服务的所有工作。

    因此,如果您按以下方式修改您的解决方案,您应该能够达到您的预期:

    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"  name="AggregatingProxy" transports="local https http"  startOnLoad="true" trace="disable">
    <target>
        <inSequence>
            <log level="full"/>
            <property name="enclosing_element">
                <result xmlns=""/>
            </property>
            <clone continueParent="true">
                <property name="aggRoot" scope="default">
                    <red:jsonObject xmlns:red="redora"/>
                </property>
                <log description="">
                    <property name="lat" expression="get-property('uri.var.lat')"/>
                    <property name="lon" expression="get-property('uri.var.lon')"/>
                    <property name="radius" expression="get-property('uri.var.radius')"/>
                </log>
                <clone continueParent="true" id="deCartaStreets">
                    <target>
                        <sequence>
                            <sequence key="DeCartaDDS"/>
                        </sequence>
                    </target>
                    <target>
                        <sequence>
                            <sequence key="DeCartaReverseGeo"/>
                        </sequence>
                    </target>
                </clone>
            </clone>
        </inSequence>
        <outSequence>
            <property name="messageType" value="application/xml" scope="axis2" type="STRING" description="messageType"/>
            <log level="full" description="">
                <property name="WSANSWER" value="true"/>
            </log>
            <aggregate>
                <completeCondition>
                    <messageCount min="2" max="-1"/>
                </completeCondition>
                <onComplete expression="$body/jsonObject">
                    <enrich>
                        <source clone="true" xpath="$body//jsonObject"/>
                        <target type="property" property="ResultItems"/>
                    </enrich>
                    <log level="custom">
                        <property name="ResultItems" expression="get-property('ResultItems')"/>
                    </log>
                    <enrich>
                        <source type="inline" clone="true">
                            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                                <soapenv:Header/>
                                <soapenv:Body>
                                    <JsonResponse xmlns="dummy"/>
                                </soapenv:Body>
                            </soapenv:Envelope>
                        </source>
                        <target type="envelope"/>
                    </enrich>
                    <enrich>
                        <source type="property" clone="true" property="ResultItems"/>
                        <target xmlns:red="dummy" action="child" xpath="//red:JsonResponse"/>
                    </enrich>
                    <log level="full" description="">
                        <property name="AGGREGATE_END" value="true"/>
                    </log>
                    <property name="messageType" value="application/json" scope="axis2" type="STRING" description="messageType"/>
                    <send/>
                </onComplete>
            </aggregate>
        </outSequence>
        <faultSequence>
            <log level="full" category="WARN"/>
        </faultSequence>
    </target>
    </proxy>
    

    API 配置:

    <api xmlns="http://ws.apache.org/ns/synapse" name="Cale-StreetsAPI" context="/Cale-StreetsAPI">
    <resource methods="GET" uri-template="/getStreets?lat={lat}&amp;lon={lon}&amp;radius={radius}">
        <inSequence>
            <call>
                <endpoint>
                    <address uri="http://localhost:8280/services/AggregatingProxy" format="soap12"></address>
                </endpoint>
            </call>
            <respond/>
        </inSequence>
    </resource>
    </api>
    

    这实际上对我有用,希望对你也有帮助。

    还可以考虑使用:

    <property name="enclosing_element">
                <result xmlns=""/>
            </property>
       ...
       <onComplete expression="$body/jsonObject" enclosingElementProperty="enclosing_element">
    

    如果您的服务返回不同类型的结果。

    谢谢, 弗拉基米尔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2015-02-27
      • 2016-11-22
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多