我正在开发需要调用多个端点的运行状况检查API。想法是,如果这些EP中的任何一个失败,我必须捕获故障并将其合并到响应中。我考虑过要创建一个调用其他叶子序列的主序列,每个叶子序列都有自己的故障序列。该图应该使事情更清楚:
seqA (faultSsqA)
/
mainSeq - seqB (faultSeqB)
\ seqC (faultSeqC)
如果所有序列都成功处理,一切都会顺利进行,并且我能够处理响应,但是,如果其中一个叶子序列中存在故障,则会执行相应的故障序列,但是我不知道如何返回执行流回到主序列。我想要的是,如果在序列B中发生异常,则执行故障序列B,然后执行流程返回到主序列,然后回到序列C。更好的是,如果我可以并行执行所有叶子序列,并最终收集所有结果。我知道迭代中介程序可以做到这一点,但是据我了解,语义与我想要的并不相同。有人对此有想法吗?
编辑:所以看来,克隆介体是我想要的,但是我仍然无法使其按我需要的方式工作。由于我将连接到不同的平台,因此响应格式是不同的。另外,我需要处理超时,500个响应代码等情况。因此,我不能简单地从每个目标调用一个端点-对于每个后端平台,我创建了一个序列来执行所有这些逻辑,并填充了一些逻辑属性,以便我可以填充最终响应(“平台A =向上”等)。我的期望是所有目标序列都将在paralel中处理
这是我的主要顺序。我使用克隆介体,将其定向到2个不同的序列,这些序列执行EP的实际调用并处理响应(我现在仅使用2个,但是将来会更多)。序列还更新了一些变量以反映后端平台的状态(“平台A = up”等)。
<sequence name="inSequence_healthCheck" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<clone id="healthCHeck">
<target>
<sequence>
<sequence key="healthCheck_wacs"/>
</sequence>
</target>
<target>
<sequence>
<sequence key="healthCheck_thesys"/>
</sequence>
</target>
</clone>
<loopback/>
</sequence>
这是目标序列之一(目前非常简单,但是其中应该包含更多逻辑)。注意,我根据响应填充属性wacsStatus。
<sequence name="healthCheck_wacs" onError="faultSequence_healthCheck_wacs" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<call>
<endpoint key="gov:ClientEquipments/endpoints/WACS/wacs_healthCheck.endpoint.xml"/>
</call>
<switch source="$axis2:HTTP_SC">
<case regex="2\d\d|4\d\d">
<property name="wacsStatus" scope="default" type="BOOLEAN" value="true"/>
</case>
<default>
<property name="wacsStatus" scope="default" type="BOOLEAN" value="false"/>
</default>
</switch>
</sequence>
这是我的outSequence,进行汇总:
<sequence name="outSequence_healthCheck" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<log>
<property name="step" value="START outSequence_healthCheck"/>
<property expression="$ctx:wacsStatus" name="wacsStatus"/>
<property expression="$ctx:thesysStatus" name="thesysStatus"/>
<property expression="$ctx:phStatus" name="phStatus"/>
<property expression="$ctx:naStatus" name="naStatus"/>
</log>
<property name="info" scope="default">
<ns:Information xmlns:ns="http://wso2.com"/>
</property>
<aggregate id="healthCHeck">
<completeCondition>
<messageCount max="-1" min="2"/>
</completeCondition>
<onComplete enclosingElementProperty="info" expression="s11:Body/child::* | s12:Body/child::*"
xmlns:m0="http://services.samples" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:s12="http://www.w3.org/2003/05/soap-envelope">
<log level="full"/>
</onComplete>
</aggregate>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<payloadFactory media-type="json">
<format>
{
"WACS" : "$1",
"thesys" : "$2"
}
</format>
<args>
<arg evaluator="xml" expression="$ctx:wacsStatus"/>
<arg evaluator="xml" expression="$ctx:thesysStatus"/>
</args>
</payloadFactory>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property name="HTTP_SC" scope="axis2" type="STRING" value="200"/>
<respond/>
</sequence>
我的期望是聚合介体将等待所有目标序列执行,届时所有属性将被正确填充,并且我可以使用payloadFactory正确格式化响应。但是,从日志中,我可以看到,即使聚合确实聚合了来自目标序列的所有响应,也无法正确填充属性,因此响应也不正确。
谢谢。
佩德罗
您应该尝试迭代调解器/克隆和聚合调解器(分散收集模式)构造。迭代允许您并行执行多个序列,而聚合将收集响应。您可以让单独的序列处理故障,并返回预期的响应或某些故障。然后,您可以检查汇总结果中是否有任何错误。
以下是一些示例:Yenlo BlogWSO2 Architecture Team