Open 0JUUU opened 2 years ago
Chunk<I>
vs Chunk<O>
Chunk<I>
: ItemReader로 읽은 하나의 아이템을 Chunk에서 정한 개수만큼 반복해서 저장Chunk<O>
: ItemProcessor에서 적절하게 가공, 필터링 ➡️ ItemWriter에 전달Chunk<I>
에 저장 ➡️ 이를 Chunk 크기만큼 실행Chunk<I>
를 ItemProcessor에 전달Chunk<O>
에 저장
Chunk<O>
를 ItemWriter에 전달execute
메서드 ➡️ ChunkOrientedTasklet 호출 // step1 구성
@Bean
@JobScope
public Step step1() {
return stepBuilderFactory.get("step1")
.<String, String>chunk(2)
.reader(new ListItemReader<>(Arrays.asList("item1", "item2", "item3", "item4", "item5", "item6")))
.processor(new ItemProcessor<String, String>() {
@Override
public String process(String item) throws Exception {
return "my_" + item;
}
})
.writer(new ItemWriter<String>() {
@Override
public void write(List<? extends String> items) throws Exception {
items.forEach(System.out::println);
System.out.println("=============");
}
})
.build();
}
Chunk<I>
만들고 내부적으로 반복문을 사용하여 ItemReader.read()
를 계속 호출 ➡️ item을 Chunk에 쌓음
Chunk<O>
를 만들고 앞에서 넘어온 Chunk<I>
의 item을 한 건씩 처리한 후 Chunk<O>
에 저장 (ItemProcessor)
Chunk<O>
에 저장 Chunk<O>
에 있는 ListChunkOrientedTasklet
실행 시 필수적 요소로 설정해야 함<I>
제네릭은 ItemReader에서 받을 데이터 타입<O>
제네릭은 ItemWriter에게 보낼 데이터 타입Chunk<O>
에 저장되지 ❌public class CustomItemStreamReader implements ItemStreamReader<String> {
private final List<String> items;
private int index = -1;
private boolean restart = false;
public CustomItemStreamReader(List<String> items) {
this.items = new ArrayList<>(items);
this.index = 0;
}
@Override
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
String item = null;
if (index < items.size()) {
item = items.get(index);
index++;
}
if (index == 6 && !restart) {
throw new RuntimeException("Restart is required");
}
return item;
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
if (executionContext.containsKey("index")) {
index = executionContext.getInt("index");
restart = true;
} else {
index = 0;
executionContext.put("index", index);
}
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
executionContext.put("index", index);
}
@Override
public void close() throws ItemStreamException {
// 리소스 해제, 초기화 작업했던 것들을 해제
System.out.println("close");
}
}
Chunk<I>
를 SimpleChunkProcessor에 넘김Chunk<O>
에 저장RepeatStatus.FINISHED
를 통해 현재 작업을 마지막으로 다음부터는 반복 작업 ❌