[SpringBatch] BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION의 EXIT_CODE, STATUS 컬럼 셋팅 정보

반응형
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 정보가 셋팅되었다.

 

 

반응형

Designed by JB FACTORY