Wso2 如何根据某些条件使VSF入站端点失败
我的情况是等待TXT文件,然后根据该文件调用RESTAPI。因此,我创建了一个代理服务,例如: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
<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使用文件连接器的解决方案。再次感谢您的时间!