작성
·
267
0
안녕하세요.! 대용량 배치를 개발하기 위해
파티션스텝을 이용하여 개발중입니다.
파티션 메인스텝에 워커 스텝을 지정하고
실행하였는데요.
Thread1의 itemReader가 1만건의 데이터를 fetch하는 동안
Thread2의 itemReader는 Thread1의 itemReader의 fetch가 끝날때까지 기다리는건가요??
제가 기대한 로그는
Thread1 : result set row 100
Thread2 : result set row 100
Thread1 : result set row 200
Thread2 : result set row 200
동시에 스레드가 실행되어 위와 같이 병렬적으로 itemreader가 수행되어야 한다고 생각하는데
실제 로그는
Thread1 : result set row 100
Thread1 : result set row 200
Thread2 : result set row 100
Thread2 : result set row 200
위와 같이 Thread1의 itemreader가 끝이 나야 Thread2의 itemreader가 동작하는것 같습니다...
제 생각이 맞을까요? 맞다면 왜 실제로그는 동기적인 방식으로 되는지 궁금합니다.
답변 1
0
질문자입니다.!
itemReader의 선언부인 (1)쪽에 data fetch를 받는 경우에
깍 쓰레드가 패치를 모두 받아야 다른 쓰레드가 진행되고 있는데 이게 맞나요??
@StepScope
@Bean
fun reader(
@Value("#{stepExecutionContext['minValue']}")
minValue: Long? = null,
@Value("#{stepExecutionContext['maxValue']}")
maxValue: Long? = null,
): ItemReader<String> {
//다른 모듈에서 row fetch 1만건 진행 --(1)
return ListItemReader(row fetch 1만건)
}
Partitioning 은 병렬로 실행되는 방식이고 Thread 마다 할당된 ItemReader 역시 별도의 객체로 생성되기 때문에 ItemReader 객체 서로간 간섭없이 동시적으로 수행이 되어야 정상입니다.
즉 ItemReader 1 과 ItemReader2 가 동시에 실행이 되어야 맞습니다.
콘솔에 찍힌 순차적 실행 로그가 동기적으로 실행된다는 의미를 품고 있는지는 잘 모르겠으나 Partitioning 과 @Scope 의 조합은 ItemReader 의 싱글톤 프록시 생성과 프록시를 통한 실제 객체들이 런타임 즉 실행 시점에 생성된다는 점입니다.
그리고 각 객체들은 상호간 동기화의 간섭없이 독립적인 실행을 하게 됩니다.
그래서 ItemReader1 이 데이터를 읽어온 후 ItemReader2 가 읽어오는 식으로 동작하지는 않습니다.
강의의 소스를 토대로 해서 다시 한번 천천히 테스트 해 보시기 바랍니다.