请求的文件不存在Mule SFTP

时间:2017-09-21 13:19:55

标签: java file groovy mule sftp

我每秒都在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.摆脱那个错误

谢谢

2 个答案:

答案 0 :(得分:0)

您可以尝试以下配置吗...我尝试将文件从FTP读取到本地目录..

  1. 用SFTP替换FTP
  2. 使用那里提供的小小的groovy脚本。这应该可行。我只是测试了这个并按预期工作。删除可以通过autoDelete属性或fileAge来完成。如果有帮助请告诉我
  3. <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入站端点可能会尝试第一次轮询该文件,但在第一次轮询有机会删除文件之前会启动第二次轮询。这样的事情发生了:

  1. 首次投票 - 找到一个文件,让我们读取它=&gt;行
  2. 首次投票 - 阅读文件并处理它=&gt;行
  3. 第二次投票 - 找到一个文件,让我们读取它=&gt;行
  4. 首次投票 - 处理完毕,删除文件=&gt;行
  5. 第二次投票 - 阅读文件并处理它=&gt; 错误:文件已被删除
  6. 正如您所看到的,第二个轮询在第一个轮询实际删除之前检测到文件的存在,但是当它尝试读取它时,第一个轮询已经删除了该文件。

    您可以在SFTP入站端点上使用tempDir属性,它会在处理之前将文件移动到读取它的文件夹的子目录中,以确保不会再次触发同一文件的后续轮询。然后它做了类似的事情:

    1. 首次投票 - 找到一个文件,将其移至tempDir ,让我们读取它=&gt;行
    2. 首次投票 - 阅读文件并处理它=&gt;行
    3. 第二次投票 - 未找到任何文件(已被移动!)=&gt;行
    4. 首次投票 - 处理完毕,删除文件=&gt;行
    5. 如:

      <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 (...) {
      
      }