我每秒都在mulesoft中从SFTP轮询,fileAge设置为0,连接池大小为1,并且启用了自动删除。然后我将文件保存到File连接器中的目录,该连接器轮询2秒,文件年龄为500(这是出站端点。然后下一个流程从与File入站端点相同的目录开始并处理文件。这是轮询设置为每3秒并启用自动删除。我收到此错误但文件已处理..
java.io.IOException: The requested file does not exist (//file/7ggot1517.txt)
at org.mule.transport.sftp.SftpClient.getSize(SftpClient.java:499)
at org.mule.transport.sftp.SftpClient.retrieveFile(SftpClient.java:378)
...
有没有人知道如何配置sftp和文件连接器:
1.从SFTP读取文件并从SFTP中删除
2.从本地目录处理文件并删除它?
3.摆脱那个错误
谢谢
答案 0 :(得分:0)
您可以尝试以下配置吗...我尝试将文件从FTP读取到本地目录..
<flow name="ftptestFlow">
<ftp:inbound-endpoint host="hostname" port="port" path="path/filename" user="userid" password="password" responseTimeout="10000" doc:name="FTP"/>
<set-variable variableName="fileName" value="fileName" doc:name="fileName"/>
<scripting:component doc:name="getFile">
<scripting:script engine="Groovy"><![CDATA[new File(flowVars.fileName).getText('UTF-8')]]></scripting:script>
</scripting:component>
<file:outbound-endpoint path="path" outputPattern="filename" responseTimeout="10000" doc:name="File"/>
</flow>
答案 1 :(得分:0)
您的SFTP入站端点可能会尝试第一次轮询该文件,但在第一次轮询有机会删除文件之前会启动第二次轮询。这样的事情发生了:
正如您所看到的,第二个轮询在第一个轮询实际删除之前检测到文件的存在,但是当它尝试读取它时,第一个轮询已经删除了该文件。
您可以在SFTP入站端点上使用tempDir
属性,它会在处理之前将文件移动到读取它的文件夹的子目录中,以确保不会再次触发同一文件的后续轮询。然后它做了类似的事情:
tempDir
,让我们读取它=&gt;行如:
<sftp:inbound-endpoint connector-ref="SFTP"
tempDir="${ftp.path}/tmpPoll"
host="${ftp.host}"
port="${ftp.port}"
path="${ftp.path}"
user="${ftp.user}"
password="${ftp.password}" doc:name="SFTP" responseTimeout="10000"/>
您还需要确保SFTP用户可以读/写子目录或在必要时创建子目录。 Everything is documented here.
编辑:要从本地计算机中删除文件,只需正确处理后,就可以使用Java或Groovy组件
try {
Files.delete(filePath);
} catch (...) {
}