내가 작성한 ChunkOrientedTasklet이 무한루프를 돌기시작했다.
엄밀히 말하면 돌기 시작한게아니고 그냥 처음부터 무한으로 돌았다.
위의 ItemReader, ItemProcessor, ItemWriter를 수행한 후 내가 심은 로그는 찍히지도 않고 그냥 무한으로 db에서 값을 가지고온다.
아니, Reader로 chunk사이즈만큼 읽어온걸 하나씩 processor에서 가공하고 모은걸 writer에서 쓰고, 다시 Reader에서 chunk만큼 읽어오고.. 이런게 아니였단말인가..?
깊게 파보면 알겠지.
chunk 단위로 반복인 Tasklet을 실행한단 뉘양스로 보인다.
구글링 결과 정말로 Tasklet을 구현한 ChunkOrientedTasklet class를 찾을 수 있었다.
이 클래스에서 내 코드를 돌리는 메소드는 execute라고 한다.
ChunkProvider를 구현한 SimpleChunkProvider의 provide다
repeatOperations.iterate(new RepeatCallback() {/*내용*/} );
위 코드를 통해 반복자를 이용함을 확인할 수 있다.
안의 함수는 chunkSize만큼 데이터가 쌓일때 까지 반복된다.
여기서 데이터는 read라는 함수를 통하는데,
이 read는 아래의 doread를 호출한다.
여기있는 itemReader.read()에서 내가 설정한 ItemReader 데이터를 조회하고, chunkSize가 될때까지 쌓는다.
ChunkProcessor를 구현한 SimpleChunkProcessor의 process메소드에서는 먼저 위의 transform 함수를 호출한다.
해당 함수에서는 반복자로 iterator.next();를 계속 가지고 와서 데이터 하나를 가지고와 doProcess를 탄다.
내가 구현한 ItemProcessor를 타서 데이터를 가공하고 return한다.
다음에 타는 wrtier도 doWrite를 호출하면서 그 안에서 내가 구현한 ItemWriter를 탄다.
그러니까.
아니 그래, 그래서 도대체 내 코드는 왜 반복문을 도는거지
[출처]
향로님의 Chunk지향 처리
향로님 계신 판교로 절올립니당 ㅎ히히