2017-02-16 5 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

코드에서 레코드를 데이터베이스에 삽입하기 위해 개인 흐름을 사용했습니다. 따라서 삽입 과정에서 발생한 예외는 상위 흐름 예외 전략에 의해 포착되지 않으며 개별 흐름에 대해 별도의 예외 전략을 가질 수 있거나 하위 흐름을 사용할 수 있습니다. 일괄 처리를 사용하여 이러한 레코드를 처리하고 모든 실패 레코드를 처리하는 별도의 단계를 만들 수있는 또 다른 깨끗한 솔루션이 있습니다.