2017-02-16 18 views
0

我正在處理應該從系統獲取CSV文件並將包含的數據插入數據庫的流程。文件中的某些記錄具有所需的錯誤格式(例如:錯誤的列數),因此我必須將其寫入另一個文本類型的文件進行分析。從CSV文件中篩選出正確的記錄,從而使用Anypoint Studio執行所需的操作

我已經創建了一個將所有好記錄插入到數據庫的流程,但它不會將錯誤記錄輸入到文件中。我目前是初學者,因此我不確定如何繼續。

的XML代碼:

<flow name="fileFlow"> 
    <file:inbound-endpoint path="src/main/resources/Input" moveToPattern="#[message.inboundProperties.originalFilename].zip" moveToDirectory="src/main/resources/Output" responseTimeout="10000" metadata:id="b85f6b05-1679-4b60-8bbe-30e6d2c68df7" doc:name="File"> 
     <file:filename-regex-filter pattern=".*csv" caseSensitive="true"/> 
    </file:inbound-endpoint> 
    <file:file-to-string-transformer doc:name="File to String"/> 
    <set-payload value="#[payload.replaceAll(&quot;,,&quot;, &quot;, ,&quot;)]" doc:name="Set Payload"/> 
    <splitter expression="#[rows=StringUtils.split(message.payload,'\r\n');ArrayUtils.subarray(rows,1,rows.size())]" doc:name="Splitter"/> 
    <flow-ref name="fileFlow1" doc:name="fileFlow1"/> 
    <catch-exception-strategy doc:name="Insert the bad record into a file"> 
     <byte-array-to-string-transformer doc:name="Byte Array to String"/> 
     <set-session-variable variableName="var" value="#[payload+'var']" doc:name="Session Variable"/> 
     <file:outbound-endpoint path="src/main/resources/Output" outputPattern="BadRecords.txt" responseTimeout="10000" doc:name="File"/> 
     <flow-ref name="fileFlow1" doc:name="fileFlow1"/> 
    </catch-exception-strategy> 
</flow> 
<flow name="fileFlow1"> 
    <expression-transformer expression="#[StringUtils.split(message.payload,',')]" doc:name="Expression"/> 
    <db:insert config-ref="MySQL_Configuration" doc:name="Database"> 
     <db:parameterized-query><![CDATA[insert into GoodRecords values(#[message.payload[0]], #[message.payload[1]], #[message.payload[2]], #[message.payload[3]], #[message.payload[4]], #[message.payload[5]], #[message.payload[6]], #[message.payload[7]], #[message.payload[8]], #[message.payload[9]], #[message.payload[10]], #[message.payload[11]], #[message.payload[12]], #[message.payload[13]], #[message.payload[14]], #[message.payload[15]], #[message.payload[16]], #[message.payload[17]], #[message.payload[18]], #[message.payload[19]], #[message.payload[20]])]]></db:parameterized-query> 
    </db:insert> 
    <logger message="#[payload] " level="INFO" doc:name="Logger"/> 
</flow> 

流結構:

Flow diagram

我個人認爲,我創建了流動是非常低效的和錯誤的。

如何將不良記錄輸入到文件中(如果給定的流程正確)? 我想對於給定的用例使用批量模式(因爲有大約1000個奇數記錄可以使用),但我不確定如何繼續。

回答

0

在你的代碼中,你使用了一個私人流程來將你的記錄插入數據庫。因此,在插入期間發生的任何異常都不會被父流異常策略捕獲,您可以爲您的私有流擁有單獨的異常策略,或者您可以使用子流。 還有一個乾淨的解決方案,您可以使用批處理來處理這些記錄,並創建一個單獨的步驟來處理所有失敗記錄。