반응형
이전 포스팅에서 Spring Batch 사용시 reader 부분에서 파일로 읽는것에 대해 다룬 포스팅이 있다.
해당 파일을 읽을때 몇가지 설정할수 있는것들이 있어 추가 포스팅으로 작성한다.
파일 인코딩 설정
파일을 읽을때 인코딩 설정을 할수가 있다.
FlatFileItemReader 를 return 하는 reader 메서드에 설정하며 아래와 같다.
..이상 생략 public FlatFileItemReader<T> reader (Class<T> type, String[] names, String delimiter) { return new FlatFileItemReaderBuilder<T>() .delimited() .delimiter(delimiter) .names(names) .targetType(type) .saveState(false) .name("BatchFileItemReader") .encoding("UTF-8") .build(); } ..이하 생략 |
빨간 부분의 encoding("UTF-8") 를 추가로 옵션 넣어주면 된다.
csv 파일 읽을때 첫 라인 무시
csv 파일을 읽을때 첫 라인은 컬럼명일 경우가 있다.
그럴 경우엔 첫 라인 무시를 해줘야한다.
인코딩과 마찬가지로 FlatFileItemReader 에서 진행하고 코드는 아래와 같다.
..이상 생략 public FlatFileItemReader<T> reader (Class<T> type, String[] names, String delimiter) { return new FlatFileItemReaderBuilder<T>() .delimited() .delimiter(delimiter) .names(names) .targetType(type) .saveState(false) .name("BatchFileItemReader") .linesToSkip(1) .build(); } ..이하 생략 |
빨간 부분의 linesToSkip(1) 를 추가로 옵션 넣어주면 된다.
에러시 패스
파일을 읽다가 에러가 발생시 설정해두는 코드이다.
이 설정은 step 에서 설정을 한다.
예시 코드는 아래와 같다.
..이상 생략 private final SkipListener skipListener; @Bean public Step mainStep() { return new StepBuilder("mainStep", jobRepository) .<TestDto,TestDto>chunk(chunkSize,platformTransactionManager) .reader(fileReader.reader(resources)) //별도의 processor 작업은 없음. .writer(writer.writer()) .faultTolerant() .skip(Exception.class) .skipLimit(Integer.MAX_VALUE) .listener(skipListener) .build(); } }..이하 생략 |
빨간 부분을 추가로 옵션 넣어주면 된다.
.faultTolerant()
.skip(Exception.class) - 에러 시 skip
.skipLimit(Integer.MAX_VALUE) - skip 갯수 지정
.listener(skipListener) - skip 시 event 지정
skipListener 은 별도로 구현을 해둬야하고 예시는 아래와 같다.
@Component public class SkipListener extends SkipListenerSupport<Object, Object> { @Override @OnSkipInRead public void onSkipInRead(Throwable t) { // Read 단계에서 스킵된 경우 로그 출력 System.err.println("Skipped in read due to: " + t.getMessage()); } @Override @OnSkipInProcess public void onSkipInProcess(Object item, Throwable t) { // Process 단계에서 스킵된 경우 로그 출력 System.err.println("Skipped in process for item " + item + " due to: " + t.getMessage()); } @Override @OnSkipInWrite public void onSkipInWrite(Object item, Throwable t) { // Write 단계에서 스킵된 경우 로그 출력 System.err.println("Skipped in write for item " + item + " due to: " + t.getMessage()); } } |
반응형
'IT > Java' 카테고리의 다른 글
[Error] No Default Constructor For Entity (8) | 2024.07.05 |
---|---|
스트러츠란?(STRUTS) (15) | 2024.07.01 |
Spring Batch 파일 읽기(FlatFileItemReader / MultiResourceItemReader) (18) | 2024.06.18 |
spring 에서 데이터 초기화 방법(Hibernate / sql 사용) (16) | 2024.06.17 |
Resource 인터페이스 관련 (22) | 2024.06.16 |
댓글