根据某些情况如何使VSF入站端点失败

问题描述

我的情况是等待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)使序列失败。我尝试使用switchmakefault中介,但是所有输入文件都移到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>

针对实际的错误消息

  1. 定义顺序并在代理中引用故障顺序,如下所示。
<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>
  1. 参考代理中的错误顺序。

您可以尝试上述方法吗?

谢谢, Dileepa