使用" Mule Requester"和FTP丢失originalFilename

时间:2015-08-05 21:44:02

标签: ftp mule esb

我正在开发一个流程,当由HTTP请求触发时,将从FTP服务器下载文件。为了按要求执行此操作,而不是轮询,我使用的是骡子请求者。

我发现没有请求者,FTP连接器将设置" incomingFilename"在每个文件的inboundProperties集合中。当与Mule请求者一起使用时,没有设置filename属性,因此我不知道我正在处理什么文件...或者在这种情况下保存到文件系统。在下面的代码中,我使用的是'计数器'文件名未经过的文件名变量。

知道如何解决这个问题吗?以下是以下流程:

<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>

2 个答案:

答案 0 :(得分:1)

更新: 以下是与请求者合作的选项,但可以使用请求集合。关键是要意识到它将返回一个MuleMessageCollection,并在请求者之后直接使用Collection Splitter,然后将使用originalFilename单独返回ftp文件消息。

在玩了一段时间之后,我发现在骡子请求者中使用FTP只有当你将它用作请求而不是请求集合时才能获得文件名。

如果您需要关联文件名,则无法使请求集合生效。

所以....如果你需要多个文件,你需要在请求者上执行类似循环的操作,直到有效负载为空。

如果您有其他方法,请告诉我。

答案 1 :(得分:0)

我编写了一个备用ftp-connector,它允许在流程中发出list-command,然后循环读取文件。

请参阅:https://github.com/rbutenuth/ftp-client-connector/