Scatter-Gather (Clone + Aggregate) не работает - PullRequest
2 голосов
/ 18 апреля 2019

Я пытаюсь вызвать две конечные точки с помощью клона и собрать их информацию для отправки с помощью агрегата, я должен использовать ее с посредником сбора-разброса. Каждая конечная точка возвращает строку в формате 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>

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

Агрегаторный посредник содержит встроенную поддержку JSON из последней версии (6.5.0) (будет выпущен в ближайшее время). Также доступна поддержка JSON для EI 6.1.1 и 6.4.0 через обновления WUM.

Вы можетеиспользуйте следующий пример конфигурации

<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/

2 голосов
/ 27 апреля 2019

Вам нужно добавить тег enclosingElementProperty, чтобы собрать все выходные данные в одно при завершенном состоянии.

Например, вы можете попробовать, как показано ниже:

<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>

Спасибо

...