我正在尝试使用mule请求程序组件进行SFTP.如何将文件名作为请求参数的一部分?这是我的流程:
<flow name="Move_Doc_To_Temp_Location" doc:name="Move_Doc_To_Temp_Location">
<jdbc-ee:inbound-endpoint queryKey="Select_Document" queryTimeout="-1" pollingFrequency="30000" connector-ref="LoanApp_Database" doc:name="Select_Doc_To_be_moved"/>
<set-variable variableName="OriginalPayload" value="#[payload]" doc:name="OriginalPayload"/>
<logger message="#[payload['DocID']] - #[payload['Location']]" level="INFO" category="Document to be moved" doc:name="Logger"/>
<!-- <mulerequester:request config-ref="Mule_Requester" resource="file:///#[payload['Location']]" doc:name="Mule Requester"/> -->
<mulerequester:request config-ref="Mule_Requester" resource="sftp://user:Pwd@Hostname#[payload['Location']]" doc:name="Mule Requester"/>
<file:outbound-endpoint path="C:\Users\jvas\Desktop\testfiles" outputPattern="#[header:originalFilename]" responseTimeout="10000" doc:name="File"/>
</flow>
Run Code Online (Sandbox Code Playgroud)
位置值解析为/opt/Documents/test.txt.当我像这样指定文件名时,它会抛出一个错误:
ERROR 2014-07-24 05:51:12,358 [[loanapp_document_flow] .Move_Doc_To_Temp_Location.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy: ****************************************************************************消息:无法在接收事件:DefaultInboundEndpoint {endpointUri = SFTP:// muledev:@ nylicvmmuledev /选择/文档/ test.txt的,连接器= SftpConnector {名称= SFTP1生命周期=启动此= aa033b numberOfConcurrentTransactedReceivers = 4个
createMultipleTransactedReceivers =真连接=真
支持协议= [SFTP] serviceOverrides =},名称= 'endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt',MEP = ONE_WAY,属性= {},transactionConfig =事务{工厂=空,动作=淡漠,超时= 0},deleteUnacceptedMessages =假,初始化状态开始=,responseTimeout = 10000,endpointEncoding = UTF-8,disableTransportTransformer = FALSE}(超时= 1000)的代码
:MULE_ERROR-92 -------- -------------------------------------------------- ----------------------异常堆栈是:1.尝试CDW到'/opt/Documents/test.txt'时出现错误'没有这样的文件'.(java.io.IOException)
org.mule.transport.sftp.SftpClient:102(null)2.无法接收事件:DefaultInboundEndpoint {endpointUri = sftp:// muledev:@nylicvmmuledev/opt/Documents/test.txt,连接器= SftpConnector {名称= SFTP1生命周期=启动此= aa033b numberOfConcurrentTransactedReceivers = 4
createMultipleTransactedReceivers =真连接=真
支持协议= [SFTP] serviceOverrides =},名称= 'endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt',MEP = ONE_WAY,属性= {},transactionConfig =事务{工厂= NULL,动作=淡漠,超时= 0},deleteUnacceptedMessages =假,初始化状态=开始,responseTimeout = 10000,endpointEncoding = UTF-8,disableTransportTransformer = FALSE}(超时= 1000)(org.mule.api.transport.ReceiveException)
org.mule.transport.AbstractMessageRequester:132(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/ReceiveException .html)----------------------------------------------- --------------------------------- Root Exception s tack trace:java.io.IOException:尝试CDW到'/opt/Documents/test.txt'时出现错误'没有这样的文件'.在org.mule.transport.sftp.SftpClient.changeWorkingDirectory(SftpClient.java:102)在org.mule.transport.sftp.SftpConnector.createSftpClient(SftpConnector.java:196)在org.mule.transport.sftp.SftpConnector.createSftpClient (SftpConnector.java:174)+ 3个以上(设置调试级别日志记录或'-Dmule.verbose.exceptions = true'表示所有内容)
现在我尝试从该位置删除文件名,SFTP成功,但它随机选择了一个文件.该文件具有SFTP的所有权限,我可以通过命令行成功执行SFTP.我已经参考了SFTP URL的文档,这是它为从URL解析文件名所提供的内容:http://tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri -04#段-4.1
使用用户名user,使用SFTP从host.example.com主机上的用户主目录中检索file.txt.此示例假定实现支持使用前导波形符指示相对于主目录的路径.
sftp://user@host.example.com/~/file.txt
Run Code Online (Sandbox Code Playgroud)
使用用户名user,使用SFTP从host.example.com上主机上的绝对路径/ dir/path中检索file.txt.
sftp://user@host.example.com/dir/path/file.txt
Run Code Online (Sandbox Code Playgroud)
Mule SFTP连接器无法获取地址中的文件名.相反,您需要使用文件名过滤器.但是,遗憾的是我认为请求者模块忽略了端点上配置的过滤器,如下所述:http://forum.mulesoft.org/mulesoft/topics/mule_module_requester_add_support_for_filenamefilter
但是,您可以使用脚本通过sftp mid flow读取文件.就像是:
<scripting:transformer>
<scripting:script engine="Groovy">
<scripting:text>
def endpointBuilder = muleContext.endpointFactory.getEndpointBuilder(
"sftp://${sftp.username}@${sftp.host}:${sftp.port}/${sftp.path}?identityFile=${app.home}/${sftp.keyPath}&passphrase=${sftp.passphrase}&connector=sftp-csv")
endpointBuilder.addMessageProcessor(new org.mule.routing.MessageFilter(new org.mule.transport.file.filters.FilenameWildcardFilter(sessionVars.expectedFilename)))
def inboundEndpoint = endpointBuilder.buildInboundEndpoint()
inboundEndpoint.request(30000L)
</scripting:text>
</scripting:script>
</scripting:transformer>
Run Code Online (Sandbox Code Playgroud)