𝑆𝑢𝑛𝑠ℎ𝑖𝑛𝑒 𝑎𝑓𝑡𝑒𝑟 𝑟𝑎𝑖𝑛✧

[Spring Batch] JobInstance, JobParameter, JobExecution, JobScope 본문

𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴💻/𝐒𝐩𝐫𝐢𝐧𝐠

[Spring Batch] JobInstance, JobParameter, JobExecution, JobScope

🤍Ryusun🤍 2023. 6. 23. 15:56

JobParameter

 

JobParameter란 job을 실행할 때 전달되는 값이다. Job 객체와 JobParameter가 만나서 실행가능한 작업 단위인 JobInstance가 만들어진다. JobParameter에는 파라미터로 전달될 객체와, 그 타입, 그리고 JobInstance의 key를 만들때 해당 파라미터를 사용할 지 여부가 들어있다. 파라미터 타입은 STRING, DATE, LONG, DOUBLE 4개가 정의되어있다.

  • JobParameter를 사용하기 위해선 @StepScope, @JobScope를 선언해야한다.
  • JobParameters는 외부에서 주입된 parameter를 관리하는 객체이다.
  • parameter를 JobParameters와 Spring EL(Expression Language)로 접근한다.
    • String parameter = jobParameters.getString(key, defaultValue);
    • @Value(“#{jobParameters[key]}”)

 

 

JobInstance

 

JobInstance는 Job에 JobParameters가 전달되어 만들어지는  작업 단위 객체이다. JobInstance에 실제 내부 동작을 위한 필드나 메소드는 존재하지않고, Job의 이름과 각각의 JobInstance를 구분하기 위한 Id만이 존재한다. 새로운 JobParameter로 Job을 실행하면 새로운 JobInstance가 만들어지고, 기존의 JobParameter로 Job을 실행하면 기존의 JobInstance를 사용한다.

 

정리

  • 다른 parameter로 Job이 실행되면, JobInstance가 생성된다.
  • 같은 parameter로 Job이 실행되면, 이미 생성된 JobInstance가 실행된다.
  • JobExecution은 항상 새롭게 생성된다.
  • Parameter가 없는 Job을 항상 새로운 JobInstance가 실행되도록 RunIdIncrementer가 제공된다.

 

 

JobExecution

 

JobExecution은 Job과 JobParameters로 만들어진 JobInstance의 실제 실행을 나타내는 객체이다. 어떠한 JobParameters가 전달되었고, 기준이되는 JobInstance가 무엇인지를 가지고있다. 그리고 작업 실행중 유지/공유되는 정보인 ExecutionContext를 가지고있다. 실행중/종료시 상태, 실패시 발생한 에러, 생성/시작/종로/마지막수정 시간 정보도 가지고 있다. Job이 isRepeatable 하고, 이전의 JobInstance의 실행 JobExecution이 실패했다면, 동일 JobInstance로 새로운 JobExecution이 생길 수 있다.

 

 

 

JobScope & StepScope

 

@Scope는 어떤 시점에 bean을 생성/소멸 시킬 지 bean의 lifecycle을 설정한다.

 

  • @JobScope는 job 실행 시점에 생성/소멸
    • Step에 선언한다.
  • @StepScope는 step 실행 시점에 생성/소멸
    • Tasklet, Chunk(ItemReader, ItemProcessor, ItemWriter) 에 선언한다.
  • Spring의 @Scope과 같은 것
    • @Scope(“job”) == @JobScope
    • @Scope(“step”) == @StepScope
  • Job과 Step 라이프사이클에 의해 생성되기 때문에 Thread safe하게 작동
  • @Value(“#{jobParameters[key]}”)를 사용하기 위해 @JobScope와 @StepScope는 필수

 

 

 JobScope와 StepScope을 설정하는 이유


JobScope와 StepScope으로 Bean의 생명주기를 설정하는 이유는 만약 여러 step에서 하나의 tasklet를 동시에 실행한다면 하나의 tasklet은 thread safe하게 작동하지 않는다.하지만 scope를 정의해주면 여러 step를 실행할때마다 새로운 tasklet을 실행하기때문에 thread safe하게 동작한다. job도 마찬가지이다.

 

 

@JobScope, @StepScope 설정

 

// step를 chunk로 생성해보기
@Bean
@JobScope
public Step chunkBaseStep(@Value("{jobParameters[chunkSize]}")String chunkSize){
@Bean
@StepScope
public Tasklet tasklet(@Value("{jobParameters[chunkSize]}")String value) {

기존의 tasklet에 @StepScope 설정해서 jobparameter를 받는다.

 

참조

https://nankisu.tistory.com/69