2014-02-24 4 views
1

나는 흐르는 행을 처리하는 스프링 배치 작업이 있습니다. 표준 리더, 프로세서 및 작가 패턴을 사용하고 있습니다.스프링 배치 - 집계 프로세서

load_id policy_number slice_numb asset_code surrender_value 
923  V317865  V317865 XXH  XXH   46230.340000 
923  V318291  V318291 XXA  XXA   40664.230000 
923  V318757  V318757 XXA  XXA   73263.360000 
923  V318757  V318757 XXF  XXF   36575.820000 
923  V318757  V318757 XXI  XXI   8723.330000 
923  V318782  V318782 XXI  XXI   9141.550000 
923  V318782  V318782 XXF  XXF   28329.550000 
923  V318782  V318782 XXA  XXA   76776.220000 

각 행 i 프로세스마다 동일한 policy_number가있는 행에 대해 SUM (surrender_value)을 가져와야합니다. policy_number V318757을 세 행이있는 예제로 기록하십시오. 이 행이 제공하는 총 항복 가치의 백분율을보고해야합니다.

나는이 내가 이것을 구현하는 방법에 대한 생각하지만, 더 나은 방법을

첫 번째 옵션 인 확신이 - 독자가 사용하는 SQL 쿼리에 SUM/그룹화 논리를 이동합니다. 이것은 필요한 모든 정보가 프로세서에서 사용할 수 있음을 의미하지만 추가 필드를 매핑해야합니다.

두 번째 옵션 - 행을 집계하기 위해 policy_number 당 총계의 맵과 영향을받은 행의 목록을 유지하는 프리 프로세서를 추가했습니다. 이 프로세서가 완성되면 결과 데이터 구조를 표준 작업을 수행하는 두 번째 프로세서로 전달합니다. 내 관심사는 여기에 너무 많은 행의 세부 정보를 캐시로 메모리 발자국이 매우 커질 수 있습니다.

모든 조언이나 조언을 부탁드립니다.

+1

가능한 솔루션 http://stackoverflow.com/questions/19906772/grouping-summarizing-spring-batch-records/19908104#19908104 –

+0

@ballabax 감사합니다. 나는이 논리를 작가 단계로 옮기기를 꺼려한다. 왜냐하면 나는 정말로 프로세서 단계에 속한다고 느낀다. 나중에 제안 된 솔루션을 게시 할 것입니다 – emeraldjava

+0

또한 http://stackoverflow.com/questions/18396259/how-to-write-more-then-one-class-in-spring-batch/18411497#18411497; 작가로 옮기는 것이 올바른 선택입니다! –

답변

4

SQL 쿼리에서 해당 유형의 집계를 수행하는 것이 좋습니다. 이 데이터 모델이 매우 복잡한 경우를 제외하고는 SQL을 통해 집계 유형을 추가하는 것이 직접적이어야하며 프로세서/작성기에서 수행하는 청크 경계와 같은 문제를 제거해야합니다 (예 : 처음 두 레코드 V318757은 하나의 덩어리에 나타나고 마지막 덩어리는 다른 덩어리에 나타납니다. 수학적으로 정확하지 않을 수 있습니다.이를 CompletionPolicy로 처리 할 수는 있지만 복잡성이 추가됩니다.