Study/Spring Batch

스프링 배치 도메인 이해 -JobExecution

공29 2024. 2. 8. 08:21

JobExecution

1) 기본 개념

  • JobInstance 에 대한 한번의 시도를 의미하는 객체로서 Job 실행 중에 발생한 정보들을 저장하고 있는 객체
    • 시작시간, 종료시간 ,상태(시작됨,완료,실패),종료상태의 속성을 가짐
    • JobExecution은 JobInstance가 실행될 때마다 생성이 된다.
  • JobInstance 과의 관계
    • JobExecution은 'FAILED' 또는 'COMPLETED‘  등의 Job의 실행 결과 상태를 가지고 있음. (Batch Status)
    • JobExecution 의 실행 상태 결과가 'COMPLETED’ 면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가
    • JobExecution 의 실행 상태 결과가 'FAILED’ 면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능
    • JobParameter 가 동일한 값으로 Job 을 실행할지라도 JobInstance 를 계속 실행할 수 있음
    • JobExecution 의 실행 상태 결과가 'COMPLETED’ 될 때까지 하나의 JobInstance 내에서 여러 번의 시도가 생길 수 있음

2) BATCH_JOB_EXECUTION 테이블과 매핑

JobInstance와 JobExecution는 1:N의 관계로서 JobInstance에 대한 성공/실패 내역을 갖고 있다.

 

실습

실습 1) COMPLETED 케이스

INFO 79263 --- [           main] o.s.b.a.b.JobLauncherApplicationRunner   : Running default command line with: [name=user1]
INFO 79263 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=JobExecution]] launched with the following parameters: [{name=user1}]
INFO 79263 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step1]
step1 has executed
INFO 79263 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [step1] executed in 16ms
INFO 79263 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step2]
step2 has executed
INFO 79263 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [step2] executed in 12ms
INFO 79263 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=JobExecution]] completed with the following parameters: [{name=user1}] and the following status: [COMPLETED] in 78ms

COMPLETED 상태로 종료되는 잡을 실행시켜본다.

- BATCH_JOB_INSTANCE 테이블

- BATCH_JOB_EXECUTION 테이블

STATUS 및 EXIT_CODE 컬럼이 COMPLETED로 저장

- BATCH_JOB_EXECUTION_PARAMS 테이블

COMPLETED로 끝났기 때문에 동일 파라미터로 재실행하면 다음과 같은 에러가 발생한다.

Caused by: org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={name=user1}.  If you want to run this job again, change the parameters.

 

실습 2) FAILED 케이스

@Bean
public Step step2() {
    return stepBuilderFactory.get("step2")
            .tasklet((contribution, chunkContext) -> {
                System.out.println("step2 has executed");
                throw new RuntimeException("step2 has failed!!!");
//                return RepeatStatus.FINISHED;
            })
            .build();
}

에러 발생하도록 코드 수정 후 실행한다.

- BATCH_JOB_INSTANCE 테이블

- BATCH_JOB_EXECUTION 테이블

STATUS 및 EXIT_CODE 컬럼이 FAILED로 저장

- BATCH_JOB_EXECUTION_PARAMS 테이블

 

JOB_EXECUTION 테이블에 FAILED로 저장되었으므로 같은 파라미터로 재실행할 수 있다.

- BATCH_JOB_EXECUTION 테이블(2)

1:N 관계