복붙노트

[SPRING] Spring-Batch에서 ItemReader로 라인을 건너 뛰는 방법?

SPRING

Spring-Batch에서 ItemReader로 라인을 건너 뛰는 방법?

텍스트 파일의 줄을 내 엔터티로 변환하는 사용자 지정 항목 판독기가 있습니다.

public class EntityItemReader extends AbstractItemStreamItemReader<MyEntity> {
    @Override
    public MyEntity read() {
       String line = delegate.read();
       //analyze line and skip by condition
       //line.split
       //create entity with line values
    }
}

이것은 FlatFileItemReader와 유사합니다.

읽은 MyEntity는 JdbcItemReader에 의해 DB에 저장됩니다.

문제점 : 가끔 건너 뛸 값이 포함 된 행이 있습니다.

그러나 reader의 read () 메서드 내에서 null을 반환하면 읽기가 완전히 끝나고이 모든 항목을 건너 뛰고이 항목을 건너 뛸 수 있습니다. 왜냐하면 널 요소는 모든 스프링 리더에 대한 "신호"이기 때문에 읽을 파일이 완성됩니다.

그래서 : null을 반환 할 수없는 경우 독자 내부의 조건에 따라 특정 행을 건너 뛰려면 어떻게해야합니까? 독자의 본성 때문에 나는 여기서 물건을 돌려 주어야합니다.

해결법

  1. ==============================

    1.나는 선을 필터링하는 좋은 방법은 독자가 아닌 프로세서를 사용하는 것이라고 생각한다. 선을 필터링하려고 할 때 널을 반환 할 수있다.

    나는 선을 필터링하는 좋은 방법은 독자가 아닌 프로세서를 사용하는 것이라고 생각한다. 선을 필터링하려고 할 때 널을 반환 할 수있다.

    http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html을 참조하십시오.

  2. ==============================

    2.나는 커스텀 리더를 사용하는 좀 더 일반적인 경우에 비슷한 문제를 겪었다. 이것은 객체 유형에 대한 반복자에 의해 뒷받침되고 읽은 각 객체에 대해 새로운 유형의 (다른 유형의) 항목을 반환합니다. 문제는 그러한 객체 중 일부가 아무 것도 매핑하지 않기 때문에이를 표시하는 것을 반환하고 싶습니다.

    나는 커스텀 리더를 사용하는 좀 더 일반적인 경우에 비슷한 문제를 겪었다. 이것은 객체 유형에 대한 반복자에 의해 뒷받침되고 읽은 각 객체에 대해 새로운 유형의 (다른 유형의) 항목을 반환합니다. 문제는 그러한 객체 중 일부가 아무 것도 매핑하지 않기 때문에이를 표시하는 것을 반환하고 싶습니다.

    결국 INVALID_ITEM을 정의하고 반환하기로 결정했습니다. 또 다른 방법은 .hasNext ()가 false가 될 때 null이 반환되는 다음 유효한 항목이 나타날 때까지 read () 메서드에서 반복기를 향상시키는 것일 수 있습니다. 그러나 더 귀찮습니다.

    처음에는 커스텀 예외를 반환하고 Spring이 그 위에 항목을 건너 뛰라고 말했지만 무시당한 것처럼 보였습니다. 그래서 (너무 많은 invalid가 어쨌든 performant가 아니라면) 포기했습니다.

  3. ==============================

    3.나는 당신이 당신의 케이크를 먹을 수 있다고 생각하지 않으며이 경우에도 (그리고 모든 코멘트를 읽은 후에) 그것을 먹을 수있다. 최선의 견해에 따르면 (제안 된대로) 사용자 정의 예외를 throw하고 '건너 뛰십시오'. 엔티티 생성이나 다른 프로세스를 최적화하여 성능을 크게 떨어 뜨리지 않아도됩니다. 행운을 빕니다.

    나는 당신이 당신의 케이크를 먹을 수 있다고 생각하지 않으며이 경우에도 (그리고 모든 코멘트를 읽은 후에) 그것을 먹을 수있다. 최선의 견해에 따르면 (제안 된대로) 사용자 정의 예외를 throw하고 '건너 뛰십시오'. 엔티티 생성이나 다른 프로세스를 최적화하여 성능을 크게 떨어 뜨리지 않아도됩니다. 행운을 빕니다.

  4. from https://stackoverflow.com/questions/27228809/how-to-skip-lines-with-itemreader-in-spring-batch by cc-by-sa and MIT license