반응형
728x90
반응형
들어가며
SimpleJob, FlowJob 에서 각 STEP의 결과 상태값에 따라 BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION 테이블의 EXIT_CODE, STATUS 컬럼에 어떻게 셋팅되어지는지 확인해보자.
명칭 | 설명 |
STATUS (batchStatus) | JobExecution, StepExecution의 속성 값으로, JOB, STEP의 최종 결과 상태를 가진다. |
EXIT_CODE (ExitStatus) | JobExecution, StepExecution의 속성 값으로, JOB, STEP의 실행 이후 어떤 상태로 종료되었는지정의한다. |
SimpleJob
package com.spring.batch.flowjob;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.builder.FlowBuilder;
import org.springframework.batch.core.job.flow.Flow;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*
--job.name=batchStatusExistStatusJob
*/
@Configuration
@RequiredArgsConstructor
public class BatchStatusExitStatusConfiguration {
// job 생성
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job batchStatusExistStatusJob() {
return this.jobBuilderFactory.get("batchStatusExistStatusJob")
.start(batchStatusExistStatusStep1())// step1, step2
.next(batchStatusExistStatusStep2())
.build();
}
@Bean
public Step batchStatusExistStatusStep1() {
return stepBuilderFactory.get("batchStatusExistStatusStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("batchStatusExistStatusStep1");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step batchStatusExistStatusStep2() {
return stepBuilderFactory.get("batchStatusExistStatusStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("batchStatusExistStatusStep2");
// 고의 설정
// EXIT_STATUS : FAILED
// BATCH_STATUS : COMPLETED
contribution.setExitStatus(ExitStatus.FAILED);
return RepeatStatus.FINISHED;
}
})
.build();
}
}
위 코드를 보면, Step2() 에서 해당 Step의 ExitStatus 를 "FAILED"로 설정했다.
BATCH_JOB_EXECUTION
컬럼명 | 값 |
STATUS | COMPLETED |
EXIT_CODE | FAILED |
BATCH_STEP_EXECUTION
- STEP1
컬럼명 | 값 |
STATUS | COMPLETED |
EXIT_CODE | COMPLETED |
- STEP2
컬럼명 | 값 |
STATUS | COMPLETED |
EXIT_CODE | FAILED |
JOB의 EXIT_CODE는 마지막에 실행된 STEP2의 EXIT_CODE 와 동일하게 셋팅된다. 또한, STATUS 컬럼도 마지막에 실행된 STEP2의 STATUS와 동일하게 셋팅된다.
FlowJob
package com.spring.batch.flowjob;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*
--job.name=flowBatchStatusExistStatusJob
*/
@Configuration
@RequiredArgsConstructor
public class FlowBatchStatusExitStatusConfiguration {
// job 생성
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job flowBatchStatusExistStatusJob() {
return this.jobBuilderFactory.get("flowBatchStatusExistStatusJob")
.start(flowBatchStatusExistStatusStep1())
// FAILED 로 끝나면, 그 다음 Step2 를 실행해라
.on("FAILED") // FAILED 되도록 설정함
.to(flowBatchStatusExistStatusStep2())
.end()
.build();
}
@Bean
public Step flowBatchStatusExistStatusStep1() {
return stepBuilderFactory.get("flowBatchStatusExistStatusStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("flowBatchStatusExistStatusStep1");
// 고의 설정
contribution.setExitStatus(ExitStatus.FAILED);
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step flowBatchStatusExistStatusStep2() {
return stepBuilderFactory.get("flowBatchStatusExistStatusStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("flowBatchStatusExistStatusStep2");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
FlowJob 에서는 Step1 에서 ExitStatus를 FAILED로 설정했다. step1()이 FAILED므로, step2()가 이어서 실행된다.
BATCH_JOB_EXECUTION
컬럼명 | 값 |
STATUS | COMPLETED |
EXIT_CODE | COMPLETED |
BATCH_STEP_EXECUTION
- STEP1
컬럼명 | 값 |
STATUS | COMPLETED |
EXIT_CODE | FAILED |
- STEP2
컬럼명 | 값 |
STATUS | COMPLETED |
EXIT_CODE | COMPLETED |
JOB의 EXIT_CODE는 마지막에 실행된 STEP2의 EXIT_CODE 와 동일하게 셋팅된다. 또한, STATUS 컬럼도 마지막에 실행된 STEP2의 STATUS와 동일하게 셋팅된다.
STEP1의 EXIT_CODE가 FAILED지만, Flow에 의해 STEP1()이 FAILED가 되어 STEP2()가 실행되었으므로, 마지막에 실행된 STEP은 STEP2다. 따라서 STEP2의 STATUS, EXIT_CODE의 값과 동일하게 JOB_EXECUTION 정보가 셋팅되었다.
반응형