【问题标题】:Requested file does not exist Mule SFTP请求的文件不存在 Mule SFTP
【发布时间】:2017-09-21 13:19:54
【问题描述】:

我每秒从 mulesoft 中的 SFTP 轮询一次,fileAge 设置为 0,连接池大小为 1,并且启用了自动删除。然后我将文件保存到文件连接器内的目录中,该连接器每 2 秒轮询一次,文件年龄为 500(这是出站端点。然后下一个流程从与文件入站端点相同的目录开始并处理文件。这里是轮询设置为每 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.Read File From SFTP and delete it from SFTP

2.处理本地目录下的文件并删除?

3.摆脱那个错误

谢谢

【问题讨论】:

  • 您能否复制/粘贴与您的问题相关的 XML 流?没有它,您的流程正在经历哪些步骤还不够清楚;)
  • 当然 :) 这是从 sftp <flow name="pullFromSftpFlow"> <sftp:inbound-endpoint connector-ref="SFTP" host="${ftp.host}" port="${ftp.port}" path="${ftp.path}" user="${ftp.user}" password="${ftp.password}" doc:name="SFTP" responseTimeout="10000"/> <file:outbound-endpoint path="C://SFTP" outputPattern="#[message.inboundProperties.originalFilename]" connector-ref="File2" responseTimeout="10000" doc:name="File"/> </flow> 进行轮询的第一个流程
  • 这是file2设置<file:connector name="File2" autoDelete="false" streaming="false" validateConnections="true" doc:name="File" pollingFrequency="2000"/,SFTP设置为polling frequency 1000,fileAge:0,autodelete:true,sizeCheckwaitTime:0
  • 然后源是文件入站端点的下一个流看起来像这样<file:inbound-endpoint path="C://SFTP" connector-ref="File" responseTimeout="10000" encoding="US-ASCII" doc:name="File" pollingFrequency="3000" autoDelete="true"> </file:inbound-endpoint> <set-variable variableName="fileName" value="#[flowVars.originalFilename]" doc:name="Save fileName"/> <logger message="#["File obatained : " +flowVars.fileName]" level="INFO" doc:name="Logger"/>,然后它去处理那个文件..希望你能帮忙:)
  • 谢谢,您也可以编辑您的答案以添加此类详细信息,更易于阅读;)因此,如果我理解正确,您的文件已正确处理,但您的日志中仍有此错误?跨度>

标签: java file groovy mule sftp


【解决方案1】:

你能试试下面的配置吗...我尝试从 FTP 读取文件到本地目录..

  1. 用 SFTP 替换 FTP
  2. 使用其中提供的小 groovy 脚本。这应该可以工作。我刚刚对此进行了测试并按预期工作。可以通过 autoDelete 属性或 fileAge 完成删除。如果这有帮助,请告诉我
<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>

【讨论】:

  • 嗨,感谢您的回复,但我现在找不到文件异常.. 我必须使用 SFTP,我要做的就是从 SFTP 下载文件,将其保存到本地文件出站端点,然后从sftp。然后从同一个文件入站端点处理文件,并在处理后将其从该文件夹中删除...我试图在 sftp 入站和文件连接器之间放置 转换器,但它看起来像在循环中,在日志中我可以看到它写入了同一个文件,例如 10 次,因为它应该在 sftp 上删除..
【解决方案2】:

您的 SFTP 入站端点可能第一次尝试轮询文件,但在第一个有机会删除文件之前启动了第二次轮询。会发生这样的事情:

  1. 第一次轮询 - 找到一个文件,让我们读取它 => 好的
  2. 第一次轮询 - 读取文件并处理它 => 好的
  3. 第二次投票 - 找到一个文件,让我们读一下 => 好的
  4. 第一次轮询 - 处理完成,删除文件 => 确定
  5. 第二次投票 - 读取文件并处理它 => 错误:文件已被删除

正如您所见,第二次轮询在第一次轮询实际删除文件之前检测到文件的存在,但在它尝试读取它时,第一次轮询已经删除了文件。

您可以在 SFTP 入站端点上使用tempDir 属性,它会将文件移动到在处理之前读取的文件夹的子目录,确保不会再次为同一文件触发后续轮询。然后它会执行以下操作:

  1. 第一次投票 - 找到一个文件,将其移至 tempDir 并让我们阅读它 => 好的
  2. 第一次轮询 - 读取文件并处理它 => 好的
  3. 第二次轮询 - 未找到文件(已移动!)=> 确定
  4. 第一次轮询 - 处理完成,删除文件 => 确定

如:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2022-01-13
    相关资源
    最近更新 更多