Spring Batch : TaskLetStep의 AllowStartIfComplete()

    TaskLetStep allowStartIfComplete 

    TaskLetStep은 allowStartIfComplete라는 메서드를 지원한다.  allowStartIfComplete를 설정하면, 이렇게 재설정된 TaskLetStep은 항상 재시작한다. 무슨 말인지 이해가 안될 수 있으니 좀 더 자세히 풀어서 적어보자. 

    한번 성공한 TaskLetStep은 동일한 JobInstance에서 다시 실행했을 때, 실행하지 않는다. 다시 실행되는 Step은 실패한 Step뿐이다. 그렇지만 이런 저런 이유로 인해 성공한 Step이라 반드시 다시 시작해야하는 경우(Validation Step 같은 것들)가 있다. 이런 Step들을 항상 다시 설정할 수 있게 AllowStartIfComplete()라는 메서드를 이용할 수 있다.

     

    TaskLetStep AllowStartIfComplete 순서도 보기

    TaskLetStep alloStartIfComplete의 순서도는 다음과 같다. 기본적으로 성공한 Step은 BatchStatus가 Completed로 된다. Completed가 아닌 경우에는 내부적으로 가지고 있는 TaskLet 객체를 수행한다. 그렇지만 Completed인 경우에는 allowStartIfComplete 설정값을 확인하고, true인 경우 이 Step을 다시 실행한다. 그렇지 않을 경우 다음 Step을 실행해준다. 

     

    TaskLetStep AllowStartIfComplete 코드로 확인하기

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step341")
                .tasklet((contribution, chunkContext) ->
                {
                    System.out.println(">>> step1 has executed");
                    return RepeatStatus.FINISHED;
                })
                .allowStartIfComplete(true)
                .build();
    }
    
    @Bean
    public Step step2() {
        return stepBuilderFactory.get("step342")
                .tasklet((contribution, chunkContext) ->
                {
                    System.out.println(">>> step2 has executed");
                    throw new RuntimeException("abc");
                })
                .startLimit(2)
                .build();
    }

    Step1에 Allow 값을 설정하고, Step2에 고의로 Exception을 발생시킨다. 이 때, 실패한 Job을 재 실행했을 때, Step1이 정상적으로 다시 실행되는지를 확인해보는 것이다. 

    JobExecution은 2번 Job이 실행되었기 때문에 동일하게 두 번 만들어지는 것을 확인했다. 

    이 때, 정상적으로 종료되었던 Step342(Completed 코드 확인)도 Job이 재시작하면서, 다시 한번 재시작하는 것을 확인할 수 있었다.

    댓글

    Designed by JB FACTORY