[英]How to use mule requester for SFTP - Dynamic file name and path
I am trying to use a mule requester component for SFTP. 我正在尝试使用mule请求程序组件进行SFTP。 How do I give the file name as part of the request argument? 如何将文件名作为请求参数的一部分? This is my flow: 这是我的流程:
<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>
The location value resolves to /opt/Documents/test.txt. 位置值解析为/opt/Documents/test.txt。 When I specify the filename like this, it throws me an error: 当我像这样指定文件名时,它会抛出一个错误:
ERROR 2014-07-24 05:51:12,358 [[loanapp_document_flow].Move_Doc_To_Temp_Location.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy: **************************************************************************** Message : Failed to receive event over: DefaultInboundEndpoint{endpointUri=sftp://muledev:@nylicvmmuledev/opt/Documents/test.txt, connector=SftpConnector { name=SFTP1 lifecycle=start this=aa033b numberOfConcurrentTransactedReceivers=4 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 / opt / Documents / test.txt,connector = SftpConnector {name = SFTP1 lifecycle = start this = aa033b numberOfConcurrentTransactedReceivers = 4
createMultipleTransactedReceivers=true connected=true createMultipleTransactedReceivers = true connected = true
supportedProtocols=[sftp] serviceOverrides= } , name='endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt', mep=ONE_WAY, properties={}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false} (timeout=1000) Code supportedProtocols = [sftp] serviceOverrides =},name ='endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt',mep = ONE_WAY,properties = {},transactionConfig = Transaction {factory = null,action = INDIFFERENT,timeout = 0},deleteUnacceptedMessages = false,initialState = started,responseTimeout = 10000,endpointEncoding = UTF-8,disableTransportTransformer = false}(timeout = 1000)代码
: MULE_ERROR-92 -------------------------------------------------------------------------------- Exception stack is: 1. Error 'No such file' occurred when trying to CDW to '/opt/Documents/test.txt'. :MULE_ERROR-92 ---------------------------------------------- ----------------------------------异常堆栈是:1。尝试时出现错误'没有这样的文件' CDW到'/opt/Documents/test.txt'。 (java.io.IOException) (java.io.IOException的)
org.mule.transport.sftp.SftpClient:102 (null) 2. Failed to receive event over: DefaultInboundEndpoint{endpointUri=sftp://muledev:@nylicvmmuledev/opt/Documents/test.txt, connector=SftpConnector { name=SFTP1 lifecycle=start this=aa033b numberOfConcurrentTransactedReceivers=4 org.mule.transport.sftp.SftpClient:102(null)2。无法接收事件:DefaultInboundEndpoint {endpointUri = sftp:// muledev:@nylicvmmuledev / opt / Documents / test.txt,connector = SftpConnector {name = SFTP1 lifecycle = start this = aa033b numberOfConcurrentTransactedReceivers = 4
createMultipleTransactedReceivers=true connected=true createMultipleTransactedReceivers = true connected = true
supportedProtocols=[sftp] serviceOverrides= } , name='endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt', mep=ONE_WAY, properties={}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false} (timeout=1000) (org.mule.api.transport.ReceiveException) supportedProtocols = [sftp] serviceOverrides =},name ='endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt',mep = ONE_WAY,properties = {},transactionConfig = Transaction {factory = null,action = INDIFFERENT,timeout = 0},deleteUnacceptedMessages = false,initialState = started,responseTimeout = 10000,endpointEncoding = UTF-8,disableTransportTransformer = false}(timeout = 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 stack trace: java.io.IOException: Error 'No such file' occurred when trying to CDW to '/opt/Documents/test.txt'. org.mule.transport.AbstractMessageRequester:132( http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/ReceiveException.html )---------- -------------------------------------------------- -------------------- Root异常堆栈跟踪:java.io.IOException:尝试CDW到'/ opt / Documents / test时出现错误'没有这样的文件' 。文本'。 at org.mule.transport.sftp.SftpClient.changeWorkingDirectory(SftpClient.java:102) at org.mule.transport.sftp.SftpConnector.createSftpClient(SftpConnector.java:196) at org.mule.transport.sftp.SftpConnector.createSftpClient(SftpConnector.java:174) + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything) org.mule.transport.sftp.SftpClient.changeWorkingDirectory(SftpClient.java:102)org.mule.transport.sftp.SftpConnector.createSftpClient(SftpConnector.java:196)org.mule.transport.sftp.SftpConnector.createSftpClient上的org.mule.transport.sftp.SftpClient.changeWorkingDirectory(SftpClient.java:102) (SftpConnector.java:174)+ 3个以上(设置调试级别日志记录或'-Dmule.verbose.exceptions = true'表示所有内容)
Now I tried removing the file name from the location, and the SFTP was successful, but it has randomly chosen a file. 现在我尝试从该位置删除文件名,SFTP成功,但它随机选择了一个文件。 The file has all permissions for SFTP and I am able to do the SFTP via command line successfully. 该文件具有SFTP的所有权限,我可以通过命令行成功执行SFTP。 I have referred to the documentation for the SFTP URL and this is what it provides for resolving the file name from the URL : http://tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri-04#section-4.1 我已经参考了SFTP URL的文档,这是它为从URL解析文件名所提供的内容: http : //tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri -04#段-4.1
Retrieve file.txt from the user's home directory on the host at host.example.com using SFTP using username user. 使用用户名user,使用SFTP从host.example.com主机上的用户主目录中检索file.txt。 This example assumes that the implementation supports the indication of a path relative to the home directory using a leading tilde. 此示例假定实现支持使用前导波形符指示相对于主目录的路径。
sftp://user@host.example.com/~/file.txt
Retrieve file.txt from the absolute path /dir/path on the host at host.example.com using SFTP using username user. 使用用户名user,使用SFTP从host.example.com上主机上的绝对路径/ dir / path中检索file.txt。
sftp://user@host.example.com/dir/path/file.txt
The Mule SFTP connector can not take the filename in the address. Mule SFTP连接器无法获取地址中的文件名。 Instead you need to use a filename filter. 相反,您需要使用文件名过滤器。 However, unfortunately I think the requestor module ignores the filters configured on the endpoint as mentioned here: http://forum.mulesoft.org/mulesoft/topics/mule_module_requester_add_support_for_filenamefilter 但是,遗憾的是我认为请求者模块忽略了端点上配置的过滤器,如下所述: http : //forum.mulesoft.org/mulesoft/topics/mule_module_requester_add_support_for_filenamefilter
You could however use a script to read a file over sftp mid flow. 但是,您可以使用脚本通过sftp mid flow读取文件。 Something like: 就像是:
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.