2016-03-28 2 views
1

MuleのSFTPコネクタからファイルを取得するフローがあります。アプリケーションには、一度処理されたファイルを削除する権限がありません。Mule SFTPインバウンドエンドポイントはタイムスタンプを公開しません

重複した処理を防ぐために、アプリケーションはファイル名とタイムスタンプに基づく冪等のフィルタを使用します。

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コネクタからファイルのタイムスタンプを取得する方法はありますか?

答えて

3

ファイルがメモリに収まるほど小さい場合:

  1. ではなく、リモートファイルのタイムスタンプを使用しようとしているのペイロードのSHAハッシュを計算しsftp:inbound-endpoint
  2. byte[]に変換し。それはとにかく動作し、より信頼できるでしょう:

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