我正在尝试使用 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。当我像这样指定文件名时,它会抛出一个错误:
错误 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,
连接器=SftpConnector { 名称=SFTP1 生命周期=启动此=aa033b
并发事务接收器数量=4
createMultipleTransactedReceivers=true 连接=true
supportProtocols=[sftp] serviceOverrides= } ,
name='endpoint.sftp.nylicvmmuledev.opt.Documents.test.txt',
mep=ONE_WAY,属性={},
transactionConfig=交易{工厂=null,操作=INDIFFERENT,
超时= 0},deleteUnacceptedMessages = false,initialState =开始,
响应超时=10000,端点编码=UTF-8,
disableTransportTransformer=false}(超时=1000)代码
:MULE_ERROR-92
-------------------------------------------------- ------------------------------ 异常堆栈是:
- 尝试将 CDW 写入“/opt/Documents/test.txt”时出现错误“没有此类文件”。 (java.io.IOException)
org.mule.transport.sftp.SftpClient:102(空)
- Failed to receive event over: 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 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'. 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 个(为所有内容设置调试级别日志记录或“-Dmule.verbose.exceptions=true”)
现在我尝试从该位置删除文件名,SFTP 成功,但它随机选择了一个文件。该文件具有 SFTP 的所有权限,我可以通过命令行成功执行 SFTP。我已经参考了 SFTP URL 的文档,这就是它提供的用于从 URL 解析文件名的内容:https://datatracker.ietf.org/doc/html/draft-ietf-secsh-scp-sftp-ssh-uri-04#section-4.1 https://datatracker.ietf.org/doc/html/draft-ietf-secsh-scp-sftp-ssh-uri-04#section-4.1
从主机上的用户主目录检索 file.txt
host.example.com 使用 SFTP 使用用户名 user。这个例子
假设实现支持路径指示
相对于使用前导波形符的主目录。
sftp://[email protected] /cdn-cgi/l/email-protection/~/file.txt
从主机上的绝对路径 /dir/path 检索 file.txt
host.example.com 使用 SFTP 使用用户名 user。
sftp://[email protected] /cdn-cgi/l/email-protection/dir/path/file.txt