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 테이블
- 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 테이블
- BATCH_JOB_EXECUTION_PARAMS 테이블
JOB_EXECUTION 테이블에 FAILED로 저장되었으므로 같은 파라미터로 재실행할 수 있다.
- BATCH_JOB_EXECUTION 테이블(2)
1:N 관계