使用 "Mule Requester" 和 FTP 丢失原始文件名
Using "Mule Requester" and FTP loses originalFilename
我正在开发一个流程,当由 HTTP 请求触发时,将从 FTP 服务器下载文件。为了根据请求而不是轮询来执行此操作,我使用了 Mule Requester。
我发现如果没有请求者,FTP 连接器将为每个文件的 inboundProperties 集合设置 "incomingFilename"。当与 Mule Requester 一起使用时,文件名 属性 未设置,因此我不知道我正在处理什么文件......或者在这种情况下保存到文件系统。在下面的代码中,我使用 'counter' 变量作为文件名,以防文件名无法通过。
知道如何解决这个问题吗?以下是流程:
<ftp:connector name="FTPConfig" pollingFrequency="3000" validateConnections="true" doc:name="FTP"></ftp:connector>
<flow name="FileRequestFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="csvfilesready" allowedMethods="GET" doc:name="HTTP"></http:listener>
<mulerequester:request-collection config-ref="Mule_Requester" resource="ftp://username:pswd@127.0.0.1:21/Incoming?connector=FTPConfig" doc:name="Mule Requester"></mulerequester:request-collection>
<foreach collection="#[payload]" doc:name="For Each">
<set-variable variableName="thefilename" value="#[message.inboundProperties.originalFilename==null ? counter.toString()+'.csv' : message.inboundProperties.originalFilename] " doc:name="Variable"/>
<file:outbound-endpoint path="/IncomingComplete" outputPattern="#[flowVars.thefilename]" responseTimeout="10000" doc:name="File"></file:outbound-endpoint>
<logger message="#['File saved as: ' + payload]" level="INFO" doc:name="Logger"></logger>
</foreach>
<logger message="#[payload]" level="INFO" doc:name="Logger"></logger>
</flow>
更新:
下面是与请求者合作的选项,但是,您可以使用请求集合。关键是要意识到它将 return 一个 MuleMessageCollection 并在请求者之后直接使用 Collection Splitter,然后它将 return 使用原始文件名单独 ftp 文件消息。
玩了一段时间后,我发现在 mule 请求器中使用 FTP 时,只有当您将其用作请求而不是请求收集时,您才能获取文件名。
如果您需要关联的文件名,则无法使请求收集工作。
所以....如果您需要多个文件,您需要在请求者上执行类似循环的操作,直到负载为空。
如果您有其他方法,请告诉我。
我写了一个备用 ftp-连接器,它允许在流程中发出一个列表命令,然后是一个循环来读取文件。
我正在开发一个流程,当由 HTTP 请求触发时,将从 FTP 服务器下载文件。为了根据请求而不是轮询来执行此操作,我使用了 Mule Requester。
我发现如果没有请求者,FTP 连接器将为每个文件的 inboundProperties 集合设置 "incomingFilename"。当与 Mule Requester 一起使用时,文件名 属性 未设置,因此我不知道我正在处理什么文件......或者在这种情况下保存到文件系统。在下面的代码中,我使用 'counter' 变量作为文件名,以防文件名无法通过。
知道如何解决这个问题吗?以下是流程:
<ftp:connector name="FTPConfig" pollingFrequency="3000" validateConnections="true" doc:name="FTP"></ftp:connector>
<flow name="FileRequestFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="csvfilesready" allowedMethods="GET" doc:name="HTTP"></http:listener>
<mulerequester:request-collection config-ref="Mule_Requester" resource="ftp://username:pswd@127.0.0.1:21/Incoming?connector=FTPConfig" doc:name="Mule Requester"></mulerequester:request-collection>
<foreach collection="#[payload]" doc:name="For Each">
<set-variable variableName="thefilename" value="#[message.inboundProperties.originalFilename==null ? counter.toString()+'.csv' : message.inboundProperties.originalFilename] " doc:name="Variable"/>
<file:outbound-endpoint path="/IncomingComplete" outputPattern="#[flowVars.thefilename]" responseTimeout="10000" doc:name="File"></file:outbound-endpoint>
<logger message="#['File saved as: ' + payload]" level="INFO" doc:name="Logger"></logger>
</foreach>
<logger message="#[payload]" level="INFO" doc:name="Logger"></logger>
</flow>
更新: 下面是与请求者合作的选项,但是,您可以使用请求集合。关键是要意识到它将 return 一个 MuleMessageCollection 并在请求者之后直接使用 Collection Splitter,然后它将 return 使用原始文件名单独 ftp 文件消息。
玩了一段时间后,我发现在 mule 请求器中使用 FTP 时,只有当您将其用作请求而不是请求收集时,您才能获取文件名。
如果您需要关联的文件名,则无法使请求收集工作。
所以....如果您需要多个文件,您需要在请求者上执行类似循环的操作,直到负载为空。
如果您有其他方法,请告诉我。
我写了一个备用 ftp-连接器,它允许在流程中发出一个列表命令,然后是一个循环来读取文件。