xml - 如何在 WSO2 ESB 应用程序中调用两个端点,但如果第一个没有失败或连接被拒绝,则只调用第二个?
问题描述
我有一个将文件发送到端点的应用程序。我想更新该应用程序以仅在第一个端点成功时将相同的文件发送到第二个端点。这将作为直接到达第一个端点的确认文件。
如果我有两个端点,如果将文件发送到第一个端点时出现任何错误,例如连接被拒绝错误,我如何确保没有调用第二个端点?
解决方案
您可以使用过滤器中介来检查后端响应代码。在下面的示例中,我检查了 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
推荐阅读
- javascript - Angular 材质风格旧时选择器/数字选择器
- tfs - 微软 TFS 研究
- javascript - 对于 javascript 的数组,为什么 [1] ==[1] 返回 false?
- python - 如何有效地从网站搜索功能返回的分页链接列表中抓取页面结果
- bash - 如何使用 bitbucket 管道和分支实现语义版本控制?
- r - 避免在 ggplot2 中按字母顺序重新排序图例
- r - 按行名计算列均值
- protocol-buffers - Protobuf 没有生成我想要的 API
- scala - 替换数据框中的值保持原始值
- android - adjustPan 和 NestedScrollView 的交互