在并行调用多个序列并在payloadfactory

时间:2018-01-15 17:49:31

标签: wso2 wso2esb

我在wso2集成器中有一个端点,它接收一些参数,调用一些其他的apis,然后产生一个新的响应。

我为每个rest api调用创建了一个序列,它将获取属性并进行特定调用。然后使用脚本调解器,我将使用响应创建一个新的有效负载,并将其放入属性中。示例:myResponseA,myResponseB,myResponseC。

我的主要终端具有IN序列,只有克隆介体和环回标记。克隆介体具有上述每个序列的靶标,如:

<clone continueParent="false" sequential="true">
    <target sequence="mySequenceA">
    </target>
    <target sequence="mySequenceB">
    </target>
</clone>

<loopback />

我的主要端点有一个带有payloadFactory和发送标记的OUT序列,如:

<payloadFactory media-type="json">
    <format>
        <![CDATA[
            {
                "myResponseA": $1,
                "myResponseB": $2
            }
        ]]>
    </format>
    <args>
        <arg expression="get-property('myResponseA')"/>
        <arg expression="get-property('myResponseB')"/>
    </args>
</payloadFactory>

<property name="HTTP_SC" scope="axis2" type="STRING" value="200"/>
<send/>

问题是,OUT序列被多次调用,克隆调解器中的每个序列都有一个。

我试图使用Aggregate mediator没有运气,'因为我的apis很安静,我不知道如何使用聚合表达式。我甚至不需要它,因为我将响应放在不同的属性中并在我的payloadFactory中读取它。

当我的所有序列都在克隆介体中返回时,如何只执行一次OUT序列?或者我应该使用另一个调解员?

Obs。:我必须并行调用这些api,因为每个api需要一些时间,我每次都会调用5~10个。

2 个答案:

答案 0 :(得分:2)

您必须使用aggragate mediator,目标是将每个响应路由到包含此聚合的单个序列。

例如,如果在mySequenceA和mySequenceB中使用send mediator,则定义“receive”属性以使用<send receive="myResponseSequence">的专用序列路由响应(mySequenceA和B中必须使用相同的“myResponseSequence”)

如果您使用呼叫中介,则使用<sequence key="myResponseSequence">调用专用序列(必须在mySequenceA和B中使用相同的“myResponseSequence”)

在myResponseSequence中,使用聚合调解器:

  • 可以让completeCondition成为默认值,ESB将等待接收与克隆介体中的目标数量相同的响应数。它给你一些像:

    <completeCondition> <messageCount min="-1" max="-1"/> </completeCondition>

  • onComplete包含将在所有响应出现时立即执行的中介序列:此序列必须包含将向调用者发送单个响应的发送中介。此“onComplete”节点上的“expression”属性将包含一个xpath,用于指示响应中的哪个节点必须到达onComplete序列中。

  • 在onComplete序列中,您可以使用payloadMediator来组成单个响应

    <onComplete xmlns:ns="http://org.apache.synapse/xsd" expression="//values"> <payloadFactory media-type="xml"> <format> <myCustomResponse> <result>$1</result> </myCustomResponse> </format> <args> <arg evaluator="xml" expression="//values"/> </args> </payloadFactory> <send/> </onComplete>

你的api安静的事实不应该是聚合调解员的问题。也许格式是json而不是xml:使用json-eval如果你想要xpath或media-type = json“inside payloadFactory

答案 1 :(得分:2)

你可以试试这个: - D

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="PoCCloneAggregate"
       transports="http"
       startOnLoad="true"
       statistics="enable"
       trace="enable">
   <description/>
   <target>
      <inSequence>
              <property name="enclosing_element" scope="default"> 
                <result xmlns=""/> 
              </property>
              <clone continueParent="false" sequential="true">
                    <target>
                        <sequence>
                           <log level="custom">
                             <property name="CLON" value="clon 1"/>
                           </log>
                           <payloadFactory media-type="json">
                            <format>
                              {"data":
                               {"temperatura":"10",
                               "id":"1"}}
                            </format>
                            <args>
                            </args>
                           </payloadFactory>
                           <loopback/>
                         </sequence>
                    </target>
                    <target>
                        <sequence>
                           <log level="custom">
                             <property name="CLON" value="clon 2"/>
                           </log>
                           <payloadFactory media-type="json">
                            <format>
                             {"data":
                              {"temperatura":"20",
                               "id":"2"}}
                            </format>
                            <args>
                            </args>
                           </payloadFactory>
                           <loopback/>
                        </sequence>
                    </target>
                    <target>
                        <sequence>
                           <log level="custom">
                             <property name="CLON" value="clon 3"/>
                           </log>
                           <payloadFactory media-type="json">
                            <format>
                             {"data":
                              {"temperatura":"30",
                               "id":"3"}}
                            </format>
                            <args>
                            </args>
                           </payloadFactory>
                           <loopback/>
                        </sequence>
                    </target>
                </clone>
      </inSequence>
      <outSequence>
         <log level="full"/>
         <aggregate>
            <completeCondition>
              <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete  expression="$body/jsonObject" xmlns:s12="http://www.w3.org/2003/05/soap-envelope" 
xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" enclosingElementProperty="enclosing_element">
               <log level="custom" separator=",">
                  <property name="MessageFlow" value="======================= Respuestas Agregadas. ==============="/>
               </log>
               <log level="full" separator=","/>
               <send/>
            </onComplete>
         </aggregate>
      </outSequence>
      <faultSequence/>
   </target>
</proxy>