我在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个。
答案 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>