Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wso2 如何根据某些条件使VSF入站端点失败_Wso2_Wso2esb_Wso2ei_Wso2mi - Fatal编程技术网

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

Wso2 如何根据某些条件使VSF入站端点失败,wso2,wso2esb,wso2ei,wso2mi,Wso2,Wso2esb,Wso2ei,Wso2mi,我的情况是等待TXT文件,然后根据该文件调用RESTAPI。因此,我创建了一个代理服务,例如: <proxy name="vsf-to-rest" startOnLoad="true" transports="vfs" xmlns="http://ws.apache.org/ns/synapse"> <target> <inSequence> <pro

我的情况是等待TXT文件,然后根据该文件调用RESTAPI。因此,我创建了一个代理服务,例如:

<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>

{“a”:“$1”,“b”:“$2”}
5.
vfs:file:////Users/me/vsf/in
文本/纯文本
移动
vfs:file:////Users/me/vsf/failed
移动
.\.txt
vfs:file:////Users/me/vsf/proceeded

问题是如何根据RESTAPI的HTTP状态(即4xx和5xx)使序列失败。我尝试使用
开关
makefault
中介,但所有输入文件都被移动到
文件夹,并且
中没有文件失败
,即使REST api返回4xx或5xx。

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

如果要根据端点调用将文件从已处理的文件夹移动到失败的文件夹,可以在端点调用后在交换机中介器中实现文件连接器[1](以评估端点响应代码),将文件从已处理的文件夹移动到失败的文件夹(我尚未在本地对此进行测试)


[1]-https://docs.wso2.com/display/ESBCONNECTORS/Working+使用+文件+连接器#使用文件连接器移动

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

如果要根据端点调用将文件从已处理的文件夹移动到失败的文件夹,可以在端点调用后在交换机中介器中实现文件连接器[1](以评估端点响应代码),将文件从已处理的文件夹移动到失败的文件夹(我尚未在本地对此进行测试)


[1]-https://docs.wso2.com/display/ESBCONNECTORS/Working+使用+文件+连接器#使用文件连接器移动

只有在调解序列中抛出axis2故障/IO错误时才会触发失败后移动

因此,您可以执行以下操作来实现您的需求

根据状态代码移动文件

<filter source="$ctx:RESPONSE_STATUS" regex="500">
    <then>
      <send>
        <endpoint>
          <address uri="vfs:file:////Users/me/vsf/failed"/>
        </endpoint>
      </send>
    </then>
</filter>

对于实际的错误消息

  • 定义一个序列并参考代理中的故障序列,如下所示
  • 
    
  • 在代理中引用错误序列
  • 你能试一下上述方法吗

    谢谢,
    Dileepa只有在中介序列中抛出axis2故障/IO错误时才会触发失败后移动

    因此,您可以执行以下操作来实现您的需求

    根据状态代码移动文件

    <filter source="$ctx:RESPONSE_STATUS" regex="500">
        <then>
          <send>
            <endpoint>
              <address uri="vfs:file:////Users/me/vsf/failed"/>
            </endpoint>
          </send>
        </then>
    </filter>
    
    
    
    对于实际的错误消息

  • 定义一个序列并参考代理中的故障序列,如下所示
  • 
    
  • 在代理中引用错误序列
  • 你能试一下上述方法吗

    谢谢,
    迪利帕

    非常感谢您的友好回复。根据您的信息,文件将被移动到VSF入站端点末尾的
    procedued
    failed
    文件夹中,即使在进一步的序列中发生任何错误,文件也不会再被移动。这是真的吗?非常感谢你的友好回复。根据您的信息,文件将被移动到VSF入站端点末尾的
    procedued
    failed
    文件夹中,即使在进一步的序列中发生任何错误,文件也不会再被移动。真的吗?谢谢你的好意。然而,恐怕解决办法是否定的。消息在调用REST api端点后变成HTTP响应,但不是原始文件,因此在调用REST api端点后使用send中介将只将HTTP响应保存到
    failed
    文件夹中的一个文件中。您是正确的@tonlytc。请为不完整的答案道歉。请参考此处的完整代码。恐怕代码中仍然存在一个问题,即一个文件已移动到vfs入站端点末尾的
    文件夹中,如果根据您的解决方案在
    失败的
    文件夹中创建新文件,则应删除该文件。但是,在
    文件夹中没有处理该文件的内容。最后,我决定接受Shanaka使用文件连接器的解决方案。再次感谢您的时间!谢谢你的忠告。然而,恐怕解决办法是否定的。消息在调用REST api端点后变成HTTP响应,但不是原始文件,因此在调用REST api端点后使用send中介将只将HTTP响应保存到
    failed
    文件夹中的一个文件中。您是正确的@tonlytc。请为不完整的答案道歉。请参考此处的完整代码。恐怕代码中仍然存在一个问题,即一个文件已移动到vfs入站端点末尾的
    文件夹中,如果根据您的解决方案在
    失败的
    文件夹中创建新文件,则应删除该文件。但是,在
    文件夹中没有处理该文件的内容。最后,我决定接受Shanaka使用文件连接器的解决方案。再次感谢您的时间!