[英]How to use mule requester for SFTP - Dynamic file name and path
我正在嘗試使用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>
位置值解析為/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 / opt / Documents / test.txt,connector = SftpConnector {name = SFTP1 lifecycle = start this = aa033b numberOfConcurrentTransactedReceivers = 4
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)代碼
: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,connector = SftpConnector {name = SFTP1 lifecycle = start this = aa033b numberOfConcurrentTransactedReceivers = 4
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)
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時出現錯誤'沒有這樣的文件' 。文本'。 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'表示所有內容)
現在我嘗試從該位置刪除文件名,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
使用用戶名user,使用SFTP從host.example.com上主機上的絕對路徑/ dir / path中檢索file.txt。
sftp://user@host.example.com/dir/path/file.txt
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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.