WSO2 EI 6.2中的并行处理

问题描述 投票:1回答:1

我正在开发需要调用多个端点的运行状况检查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正确格式化响应。但是,从日志中,我可以看到,即使聚合确实聚合了来自目标序列的所有响应,这些属性也没有正确填充,因此响应不正确。

谢谢。

佩德罗

wso2 wso2esb wso2ei
1个回答
0
投票

您应该尝试迭代调解器/克隆和聚合调解器(分散收集模式)构造。迭代允许您并行执行多个序列,而聚合将收集响应。您可以让单独的序列处理故障,并返回预期的响应或某些故障。然后,您可以检查汇总结果中是否有任何错误。

以下是一些示例:Yenlo BlogWSO2 Architecture Team

© www.soinside.com 2019 - 2024. All rights reserved.