본문 바로가기
개발/SpringBoot

SpringBoot3(SpringBatch5) 동일(or 이전) 파라미터 재사용 해결

by 궁즉변 변즉통 통즉구 2023. 6. 5.
반응형

SpringBatch에서 파라미터 처리에 대한 부분이 지속적으로 문제가 있는것 같다. 최근에 SpringBoot3에 SpringBatch5를 적용하면서 파라미터가 있으면 파라미터 값을 적용하고 파라미터가 없는 경우 소스 내부의 디폴트 값을 적용하는 로직을 처리하는 중에 문제를 발견하고 해결한 방법을 정리해본다.

 

먼저 동일한 파라미터라도 배치가 실행되도록 job에 RunIdIncrementer()를 적용한 상황이었다.

public Job job() {
    return jobBuilderFactory.get("myJob")
            .incrementer(new RunIdIncrementer())
            .start(step(null))
            .build();
}

그리고 파라미터를 변경하면서 테스트를 했을 때 잘 동작하는 것을 확인했다. 그런데 파라미터가 넘기지 않을 경우 계속 이전의 사용했던 파라미터 값이 적용이 되는 상황이 발생했다. Log를 보면 run.id값을 계속 변경이 되는데 이전에 테스트했던 파라미터 값이 그대로 적용이 되었다. 

 

이것저것 찾아보니 SpringBatch4부터 이런 버그가 있었고, 아직 해결이 안된 상황인거 같아서 아래와 같이 별도의 RunIdIncrementer()를 정의하여 사용하니 해결이 되었다. 

public class UniqueRunIdIncrementer extends RunIdIncrementer {
    private static final String RUN_ID = "run.id";

    @Override
    public JobParameters getNext(JobParameters parameters) {
        JobParameters params = (parameters == null) ? new JobParameters() : parameters;
        return new JobParametersBuilder()
                .addLong(RUN_ID, params.getLong(RUN_ID, 0L) + 1)
                .toJobParameters();
    }
}

 

 

다음과 같이 적용을 하고 테스트해보니 원하는데로 동작을 한다.

public Job job() {
    return jobBuilderFactory.get("myJob")
            .incrementer(new UniqueRunIdIncrementer())
            .start(step(null))
            .build();
}

 

추가적인 자세한 내용은 다음을 참고하자. : https://jojoldu.tistory.com/487

 

반응형

댓글