问题描述
我的情况是等待TXT文件,然后根据该文件调用REST api。因此,我创建了一个代理服务,例如:
<proxy name="vsf-to-rest" startOnLoad="true" transports="vfs" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property expression="$trp:FILE_NAME" name="filename" scope="default" type="STRING"/>
<script language="js"><![CDATA[var filename = mc.getProperty('filename');
var s = filename.split('_');
mc.setProperty('a',s[0]);
mc.setProperty('b',s[1]);]]></script>
<payloadFactory media-type="json">
<format>{"a":"$1","b":"$2"}</format>
<args>
<arg evaluator="xml" expression="get-property('a')" literal="true"/>
<arg evaluator="xml" expression="get-property('b')" literal="true"/>
</args>
</payloadFactory>
<call>
<endpoint key="mock-task-endpoint"/>
</call>
<drop/>
</inSequence>
<outSequence>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.PollInterval">5</parameter>
<parameter name="transport.vfs.FileURI">vfs:file:////Users/me/vsf/in</parameter>
<parameter name="transport.vfs.ContentType">text/plain</parameter>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.vfs.MoveAfterFailure">vfs:file:////Users/me/vsf/Failed</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.FileNamePattern">.*\.txt</parameter>
<parameter name="transport.vfs.MoveAfterProcess">vfs:file:////Users/me/vsf/proceeded</parameter>
</proxy>
问题是如何根据REST api的HTTP状态(即4xx和5xx)使序列失败。我尝试使用switch
和makefault
中介,但是所有输入文件都移到proceeded
文件夹中,即使REST api返回4xx或5xx,Failed
中也没有文件。
解决方法
这是EI中的预期行为。仅在读取文件或处理文件时发生错误的情况下才会发生MoveAfterFailure。如果调解中发生任何错误(例如端点调用失败),则不会将其视为VFS失败。
如果要基于端点调用将文件从已处理的文件夹移动到失败的文件夹,则可以在端点调用以下命令后在开关介体中实现文件连接器[1](以评估端点响应代码)。将文件从已处理的文件夹移至失败的文件夹(我尚未在本地进行测试)。
[1] -https://docs.wso2.com/display/ESBCONNECTORS/Work+with+the+File+Connector#WorkingwithFileConnector-move
,仅在调解序列中引发axis2故障/ IO错误时,才会触发故障后移动。
因此,您可以执行以下操作来满足您的要求。
根据状态码移动文件
<filter source="$ctx:RESPONSE_STATUS" regex="500">
<then>
<send>
<endpoint>
<address uri="vfs:file:////Users/me/vsf/failed"/>
</endpoint>
</send>
</then>
</filter>
针对实际的错误消息
- 定义顺序并在代理中引用故障顺序,如下所示。
<sequence xmlns="http://ws.apache.org/ns/synapse" name="errorSequence">
<log level="custom">
<property name="MESSAGE" value="ERROR OCCURRED"/>
</log>
<property name="ERROR_STATUS" expression="$ctx:ERROR_CODE"/>
<!-- log some data -->
<log level="custom">
<property name="FILE_NAME" expression="$ctx:FILE"/>
<property name="FILE_CONTENT" expression="$ctx:CONTENT"/>
<property name="STATUS" expression="$ctx:ERROR_STATUS"/>
</log>
<property name="OUT_ONLY" value="true"/>
<send>
<endpoint>
<address uri="vfs:file:////Users/me/vsf/failed"/>
</endpoint>
</send>
</then>
</sequence>
- 参考代理中的错误顺序。
您可以尝试上述方法吗?
谢谢, Dileepa