如何使用 Mule 请求程序进行 SFTP - 动态文件名和路径

2024-01-29

我正在尝试使用 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 -------------------------------------------------- ------------------------------ 异常堆栈是:

  1. 尝试将 CDW 写入“/opt/Documents/test.txt”时出现错误“没有此类文件”。 (java.io.IOException)
    org.mule.transport.sftp.SftpClient:102(空)
  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
    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

Mule SFTP 连接器无法获取地址中的文件名。相反,您需要使用文件名过滤器。但是,不幸的是,我认为请求者模块忽略了端点上配置的过滤器,如下所述: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

不过,您可以使用脚本通过 sftp 中流读取文件。就像是:

<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}&amp;passphrase=${sftp.passphrase}&amp;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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Mule 请求程序进行 SFTP - 动态文件名和路径 的相关文章

随机推荐