Spring Batch 무한 루프

성현·2024년 7월 26일
0

SpringBatch

목록 보기
4/5
post-thumbnail

내가 작성한 ChunkOrientedTasklet이 무한루프를 돌기시작했다.
엄밀히 말하면 돌기 시작한게아니고 그냥 처음부터 무한으로 돌았다.

ItemReader

ItemProcessor

ItemWriter

위의 ItemReader, ItemProcessor, ItemWriter를 수행한 후 내가 심은 로그는 찍히지도 않고 그냥 무한으로 db에서 값을 가지고온다.

아니, Reader로 chunk사이즈만큼 읽어온걸 하나씩 processor에서 가공하고 모은걸 writer에서 쓰고, 다시 Reader에서 chunk만큼 읽어오고.. 이런게 아니였단말인가..?

깊게 파보면 알겠지.

ChunkOrientedTasklet?

chunk 단위로 반복인 Tasklet을 실행한단 뉘양스로 보인다.
구글링 결과 정말로 Tasklet을 구현한 ChunkOrientedTasklet class를 찾을 수 있었다.

이 클래스에서 내 코드를 돌리는 메소드는 execute라고 한다.

  • chunkProvider.provide(contribution) 을 통해 데이터를 읽어온다.
    내가 구현한 ItemReader를 이용하여 Chunksize만큼 데이터를 가지고온다.
  • chunkProcessor.process(contribution, inputs)을 통해 데이터를 가공하고 저장한다.
    ItemProcessor와 ItemWriter를 사용한다.

Provide

ChunkProvider를 구현한 SimpleChunkProvider의 provide다

 repeatOperations.iterate(new RepeatCallback() {/*내용*/} );

위 코드를 통해 반복자를 이용함을 확인할 수 있다.
안의 함수는 chunkSize만큼 데이터가 쌓일때 까지 반복된다.
여기서 데이터는 read라는 함수를 통하는데,
이 read는 아래의 doread를 호출한다.

여기있는 itemReader.read()에서 내가 설정한 ItemReader 데이터를 조회하고, chunkSize가 될때까지 쌓는다.

process

ChunkProcessor를 구현한 SimpleChunkProcessor의 process메소드에서는 먼저 위의 transform 함수를 호출한다.

해당 함수에서는 반복자로 iterator.next();를 계속 가지고 와서 데이터 하나를 가지고와 doProcess를 탄다.

내가 구현한 ItemProcessor를 타서 데이터를 가공하고 return한다.

다음에 타는 wrtier도 doWrite를 호출하면서 그 안에서 내가 구현한 ItemWriter를 탄다.

그러니까.

  • Reader는 반복을 통해 읽어온 데이터의 수가 chunkSize와 같을 때 까지 하나씩 읽어오고
  • Processor는 반복자를 통해 reader에서 읽어온 데이터를 하나하나 가공하고
  • Writer는 읽어온 chunk단위의 데이터를 저장한다.

아니 그래, 그래서 도대체 내 코드는 왜 반복문을 도는거지

[출처]

향로님의 Chunk지향 처리
향로님 계신 판교로 절올립니당 ㅎ히히

profile
행동하는 사람

0개의 댓글