首页 > 解决方案 > 如何在 WSO2 ESB 应用程序中调用两个端点,但如果第一个没有失败或连接被拒绝,则只调用第二个?

问题描述

我有一个将文件发送到端点的应用程序。我想更新该应用程序以仅在第一个端点成功时将相同的文件发送到第二个端点。这将作为直接到达第一个端点的确认文件。

如果我有两个端点,如果将文件发送到第一个端点时出现任何错误,例如连接被拒绝错误,我如何确保没有调用第二个端点?

标签: xmlwso2wso2esbvfs

解决方案


您可以使用过滤器中介来检查后端响应代码。在下面的示例中,我检查了 HTTP 状态代码,只有当它是 200 时才会调用第二个端点。根据您的后端,您可以更改所需的响应代码。过滤介体与 java if-else 条件非常相似,您可以参考文档 [1] 进行进一步说明。在这里,我添加了一个有效负载工厂调解器,以在失败时创建错误响应。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="file_upload"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <log level="custom">
            <property name="Invoking " value="First backend"/>
         </log>
         <call>
            <endpoint>
               <http uri-template="http://run.mocky.io/v3/61ebc934-5719-4cc6-8347-f121f18d9f37"/>
            </endpoint>
         </call>
         <filter regex="200" source="$axis2:HTTP_SC">
            <then>
               <log level="custom">
                  <property name="Invoking " value="Second backend"/>
               </log>
               <call>
                  <endpoint>
                     <http uri-template="http://run.mocky.io/v3/49f40df3-bb95-4f43-94fe-282fd72325ec"/>
                  </endpoint>
               </call>
            </then>
            <else>
               <payloadFactory media-type="json">
                  <format>{"Backend":"$1","Response code":"$2"}</format>
                  <args>
                     <arg value="Failute"/>
                     <arg evaluator="xml" expression="$axis2:HTTP_SC"/>
                  </args>
               </payloadFactory>
            </else>
         </filter>
         <respond/>
      </inSequence>
   </target>
   <description/>
</proxy>
                            

[1]-https://docs.wso2.com/display/EI610/Filter+Mediator

更新

ESB 应该有一种机制来识别文件是否上传成功。如果无法检查您是否无法验证文件是否已成功上传。但是您想检查连接超时等问题,您可以将端点的 responseAction [2] 定义为故障。如果在连接到端点时出现任何问题,它将调用代理服务中定义的故障序列。

<timeout>
            <duration>timeout duration in seconds</duration>
            <responseAction>fault</responseAction>
</timeout>

[2]-https://docs.wso2.com/display/EI611/Endpoint+Error+Handling


推荐阅读