본문 바로가기

강의/스프링배치

SimpleJob - 개념 및 API 소개 (validator)

1. 기본 개념

 - Job 실행에 꼭 필요한 파라미터를 검증하는 용도

 - DefaultJobParametersValidator 구현체를 기본적으로 지원하며, 좀 더 복잡한 제약 조건이 있다면 인터페이스를 직접 구현할 수도 있음.

 

2. 구조

 - JobParametersValidator 클래스에서 validator 메서드를 사용하며, JobParameterValidator 타입의 인자를 받게 되어있음

 

job이 실행하게 되면

api에 validate 메서드를 설정하면서 jobParameterValidator

 

 

 

 

@RequiredArgsConstructor
@Configuration
public class ExecutionContextConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    private final JobExecutionListener jobRepositoryListener;

    @Bean
    public Job batchJob1() {
        return jobBuilderFactory.get("batchJob1")
                .start(step1())
                .next(step2())
                .validator(new CustomJobParametersvalidator())
                .listener(jobRepositoryListener)
                .build();
    }
}

 

 

package io.springbatch.springbatch;

import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.JobParametersValidator;

public class CustomJobParametersvalidator implements JobParametersValidator {


    @Override
    public void validate(JobParameters jobParameters) throws JobParametersInvalidException {
        // jobparameters 에는 job을 수행할 때 job에 전달한 key와 value 값들이 저장되어 있음.
        // parameter에 key값인 name에 해당하는 value가 존재하지 않는 경우 문제 발생
        if (jobParameters.getString("name") == null) {
            throw new JobParametersInvalidException("name parameters is not found");
        }
    }
}

 

총 두번의 검증단계에 들어감

 

Job이 수행되기 전에 jobRepository의 기능이 시작하기 전에 한번 검증 하고

job이 실행되기 전에 검증을 한번 한다.

 

SimpleJobLauncher를 보면 validate를 한번 한다.

 

SimpleJob은 AbstractJob을 상속 받고 있는데

AbstractJob에서 검증을 하는 단계가 나타난다.

AbstractJob 클래스 execute 메서드 에서 2번째 검증을 하는 로직이 추가되어있다.

 

지금은 우리가 custom validator 를 만들어서 사용하였는데

일반적으로 이렇게 custom validator를 사용하지 않으면

DefaultJobParametersValidator 클래스를 사용하게 된다.

 

DefaultjobParametersvalidator 클래스 validate 메서드에서는

requiredKeys 값과 optionalKeys 값들을 확인하고 있다.

 

아래와 같이 사용할 수 있다.

@RequiredArgsConstructor
@Configuration
public class ExecutionContextConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    private final JobExecutionListener jobRepositoryListener;

    @Bean
    public Job batchJob1() {
        return jobBuilderFactory.get("batchJob1")
                .start(step1())
                .next(step2())
                .validator(new DefaultJobParametersValidator(new String[]{"name","date"}, new String[]{"count"}))
                .listener(jobRepositoryListener)
                .build();
    }
}