본문 바로가기

강의/스프링배치

스프링 배치 - 사용자 정의 ExitStatus

상태값이 이미 정의 되어있다.

Complete Stopped Failed Executing Unknow Noop

 

이미 정의된 것 외에도 사용자가 직접 지정하여 사용할 수 있다.

StepExecutionListener의 afterStep() 메서드에서 Custom exitCode를 생성 후 새로운 ExitStatus 반환 가능

 

 

getCompositieListener 를 호출하면

우리가 StepExecutionListener을 구현한 구현체가 호출이 된다

 

 

 

package io.springbatch.springbatch.customExitStatus;

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.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@RequiredArgsConstructor
@Configuration
public class CustomExitStatusConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job customExitStatusJob() {
        return jobBuilderFactory.get("customExitStatusJob")
                .start(customExitStatusStep1())
                    .on("FAILED")
                    .to(customExitStatusStep2())
                    .on("PASS")
                    .stop()
                .end()
                .build();
    }

    @Bean
    public Step customExitStatusStep1() {
        return stepBuilderFactory.get("customExitStatusStep1")
                .tasklet((stepContribution, chunkContext) -> {
                    System.out.println("custom exit status step1 was executed");
                    stepContribution.getStepExecution().setExitStatus(ExitStatus.FAILED);
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    @Bean
    public Step customExitStatusStep2() {
        return stepBuilderFactory.get("customExitStatusStep2")
                .tasklet((stepContribution, chunkContext) -> {
                    System.out.println("custom exit status step2 was executed");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

 

step1 - batchstatus (failed), exitStatus (failed)

step2 - batchstatus (completed), exitstatus (completed)

job - batchstatus (failed), exitstatus (failed)

 

step1은 아무런 이상이 없고

jobExecution은 맨 마지막의 step 상태값이 저장되기 때문에 step1은 jobExecution의 영향을 주지 않는다.

step2는 completed로 종료 되었는지만, step2가 pass 할 때에 대해서만 처리를 해 놓았지

completed 로 종료되었을 때 설정을 지정하지 않았기 때문에 jobexecution의 상태값이 failed이다.

 

 

 

상태값을 바꾸는 것은 AbstractStep에서 확인할 수 있다.