如何根据某些条件使 VSF 入站端点失败

How to make VSF inbound endpoint fail according to some conditions

我的情况是等待 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":"", "b":""}</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 文件夹并且 failed 中没有文件,即使 REST api returns 4xx 或 5xx.

这是 EI 中的预期行为。 MoveAfterFailure 仅在读取文件或处理文件时发生错误的情况下发生。如果在中介中出现任何错误,例如端点调用失败,则不会将其视为 VFS 失败。

如果您想根据端点调用将文件从已处理的文件夹移动到失败的文件夹,您可以在端点之后的切换中介中实现文件连接器 [1](以评估端点响应代码)调用以将文件从已处理的文件夹移动到失败的文件夹(我没有在本地测试过)。

[1]-https://docs.wso2.com/display/ESBCONNECTORS/Working+with+the+File+Connector#WorkingwiththeFileConnector-移动

只有在调解序列中抛出 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. 引用代理中的错误序列。

可以试试上面的方法吗?

谢谢, 迪利帕