Как использовать реквестер mule для SFTP - динамическое имя и путь к файлу

Я пытаюсь использовать компонент запроса мула для 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. Когда я указываю имя файла вот так, возникает ошибка:

Теперь я попытался удалить имя файла из местоположения, и SFTP прошел успешно, но файл был выбран случайным образом. Файл имеет все разрешения для SFTP, и я могу успешно выполнить SFTP через командную строку. Я сослался на документацию для URL-адреса SFTP, и это то, что она обеспечивает для разрешения имени файла из URL-адреса: http://tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri-04#section-4.1 < / а>


Получите file.txt из домашнего каталога пользователя на хосте host.example.com, используя SFTP, используя имя пользователя user. В этом примере предполагается, что реализация поддерживает указание пути относительно домашнего каталога с помощью ведущей тильды.

Получите file.txt из абсолютного пути / dir / path на хосте host.example.com, используя SFTP, используя имя пользователя user.

    sftp://[email protected]/~/file.txt

Коннектор Mule SFTP не может принимать имя файла в адресе. Вместо этого вам нужно использовать фильтр имени файла. Однако, к сожалению, я думаю, что модуль запроса игнорирует фильтры, настроенные на конечной точке, как указано здесь: http://forum.mulesoft.org/mulesoft/topics/mule_module_requester_add_support_for_filenamefilter

    sftp://[email protected]/dir/path/file.txt

person jvas    schedule 24.07.2014    source источник


Ответы (1)


Однако вы можете использовать сценарий для чтения файла через sftp mid flow. Что-то вроде:

Только один вопрос, что означает 30000L? Это настройка тайм-аута?

<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>
person Ryan Carter    schedule 24.07.2014
comment
Отлично :) Тогда примешь ответ? Поскольку он запрашивает файл, он будет ждать до 30000 миллисекунд, чтобы получить его. Вы можете изменить это на все, что захотите. - person jvas; 24.07.2014
comment
Поскольку он запрашивает файл, он будет ждать до 30000 миллисекунд, чтобы получить его. Вы можете изменить это на все, что захотите. - person Ryan Carter; 24.07.2014
comment
Я только заметил, что он не обрабатывает исключения, как это делают компоненты мула. Например, Если файла нет, он возвращает мне NullPayload. Есть ли способ справиться с этим? Вы знаете, как я могу получить фактическое сообщение об ошибке SFTP? (Например, если каталог недоступен и т. Д.) - person Ryan Carter; 24.07.2014
comment
что такое идентификационный файл и кодовая фраза? для чего это используется. Я предполагаю, что парольная фраза - это пароль. Так для чего же тогда используется идентификационный файл? Для проверки удаленного сервера? но как вы можете указать на некоторые ресурсы для того же самого. - person jvas; 24.07.2014
comment
ОШИБКА 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 = начать это = aa033b numberOfConcurrentTransctedReceivers = 4
createMultipleTransestedReceivers = 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, коннектор = SftpConnector {name = SFTP1 lifecycle = start this = aa033b numberOfConcurrentTransctedReceivers = 4
createMultipleTransctedReceivers = true connected = true
supportedProtocols = [sftp] serviceOverrides =}, name = 'endpoint.sftp.nylicvmmuledev.o .Documents.test.txt ', mep = ONE_WAY, properties = {}, transactionConfig = Transaction {factory = null, action = INDIFFERENT, timeout = 0}, deleteUnacceptedMessages = false, initialState = start, 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) ---------------------- -------------------------------------------------- -------- Трассировка стека корневого исключения: 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.createSavapClient больше (установите ведение журнала уровня отладки или '-Dmule.verbose.exceptions = true' для всего) - person Jasser; 19.12.2018