问题描述
我有一个将文件发送到端点的应用程序。我要更新该应用程序,以便仅在第一个端点成功的情况下才将同一文件发送到第二个端点。这将作为直接到达第一个端点的确认文件。
如何确保我有两个未调用第二个端点的端点,将文件发送到第一个端点时是否存在错误,例如连接被拒绝错误?
解决方法
您可以使用过滤器介体来检查后端响应代码。在下面的示例中,我检查了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