Входящая конечная точка Mule SFTP не предоставляет отметку времени

У меня есть поток, который получает файлы из SFTP-коннектора в Mule. У приложения нет разрешения на удаление файлов после обработки.

Чтобы предотвратить дублирование обработки, приложение использует идемпотентный фильтр, основанный на имени файла и метке времени.

SFTP не возвращает отметку времени каждого файла в сообщении. В результате message.inboundProperties.timestamp возвращается как null.

<!-- SFTP connector -->
<sftp:connector 
    name="SFTP_Origin" 
    validateConnections="true" 
    pollingFrequency="${sftp.origin.pollingFrequency:60000}" 
    fileAge="${sftp.origin.fileAge:60000}" 
    duplicateHandling="overwrite" 
    doc:name="SFTP" 
    archiveDir="${local.archive.directory}"/>

<!-- Move XML files from one SFTP location to another location.
     Archive each file locally on the mule server in the event the file transfer fails.
     Upon failure, notify those responsible so that action can be remedied. -->
<flow name="TransferFilesViaSFTP_Flow" >
    <sftp:inbound-endpoint 
        connector-ref="SFTP_Origin" 
        host="${sftp.origin.host}" 
        port="${sftp.origin.port:22}" 
        path="${sftp.origin.path}" 
        user="${sftp.origin.user}" 
        password="${sftp.origin.password}" 
        responseTimeout="10000" 
        archiveDir="${local.archive.directory}" 
        doc:name="InboundSFTPEndpoint">
        <!-- Use RegEx filter to filter only files with within the proper date format YYYYMMdd
                             Range of dates are from 19000101 to 20991231 -->
        <file:filename-regex-filter pattern="${regex.filter:filename(.*)xml}" caseSensitive="false"/>
    </sftp:inbound-endpoint>
    <!-- Get the files via SFTP -->

    <logger 
        message="#[message]" 
        level="INFO" 
        category="sftp" 
        doc:name="Logger"/>

    <!-- Eliminate redundant file transfers by filtering out files that have 
         been transfered previously, unless their timestamp has changed. -->
    <idempotent-message-filter 
        idExpression="#[message.inboundProperties.originalFilename + '-' + 
                        message.inboundProperties.timestamp]" 
        storePrefix="prefix" 
        doc:name="Filter out redundant files transfers">
        <simple-text-file-store 
            name="filesMessages" 
            directory="${idempotent.directory}"/>
    </idempotent-message-filter>

    <!-- log event information -->
    <logger
        message="#['Payload after SFTP is ' + payload]"
        level="DEBUG"
        doc:name="Payload Logger" 
        category="sftp"/>

    <!-- Send the files to Windows Share -->
    <file:outbound-endpoint 
        path="${windows.share.path}" 
        connector-ref="WindowsShareFile" 
        responseTimeout="10000" 
        doc:name="File"/>

    <!-- log event information -->
    <logger 
        message="#['file ' + message.inboundProperties.'originalFilename' + ' successfully processed.']" 
        level="INFO" 
        category="sftp" 
        doc:name="Logger: Success"/>

    <!-- Based on property, smtp.onSuccess.sendEmail, notify when files have been moved successfully. -->
    <expression-filter 
        expression="#[${smtp.onSuccess.sendEmail:false}]" 
        doc:name="onSuccess Send Email"/>

    <set-session-variable 
        variableName="emailSubject" 
        value="#['Mule Flow Successful']" 
        doc:name="emailSubject"/>

    <flow-ref 
        name="aggregateSuccessfulFilesTransferForEmail_Subflow" 
        doc:name="aggregateSuccessfulFilesTransferForEmail_Subflow"/>

    <!-- default exception strategy -->
    <exception-strategy 
        ref="transferFilesExceptionStrategy" 
        doc:name="Reference Exception Strategy"/>
</flow>

Я обнаружил нерешенную проблему с этим на Mulesoft. https://www.mulesoft.org/jira/browse/MULE-7175

Есть ли альтернативный метод, с помощью которого я могу получить временную метку файла из SFTP-коннектора?


person tbriscoe    schedule 28.03.2016    source источник


Ответы (1)


Если файл достаточно мал, чтобы поместиться в памяти:

  1. Превратите его в byte[] после sftp:inbound-endpoint
  2. Вычислите хэш SHA полезной нагрузки вместо того, чтобы пытаться использовать метку времени удаленного файла. В любом случае это будет работать и будет надежнее:

    idExpression="#[message.inboundProperties.originalFilename + '-' + 
                    org.apache.commons.codec.digest.DigestUtils.sha256Hex(message.payload)]"
    
person David Dossot    schedule 28.03.2016