Spring Batch : SImpleJob Incrementer 관련

    SImpleJob Incrementer 

    동일한 SimpleJob을 실행하기 위해서는 전달되는 JobParameters가 달라야 한다. JobParameters를 매번 다르게 주는 방법도 있지만, SimpleJobBuilder에서 제공하는 incrementer() 메서드를 이용하면 손쉽게 다른 JobParameters를 전달해서 동일한 Job을 계속 실행할 수 있다. 

     


    SimpleJob Incrementer

    • JobParameters에서 필요한 값을 증가시켜 다음에 사용될 JobParameters 객체를 반환함.
    • 기존의 JobParameter의 변경없이 여러번 Job을 실행할 때 사용
    • RunIdIncrementer를 제공함.
    • JobParametersIncrementer 인터페이스를 구현해서 사용할 수도 있음

    요점은 다음과 같다. Incrementer를 구현해서 사용하면, 기존에 전달되는 JobParameters를 변경하지 않으면서 JobParameters를 추가해서 동일한 Job을 변경점 없이 여러번 실행할 수 있게 된다. 

     


    Incrementer의 사용방법

    JobParameterIncrementer는 JobBuilder에 incrementer() 메서드를 이용해서 설정해 줄 수 있다. 

    incremneter 메서드를 타고 들어가보면 JobBuilderHelper 클래스가 가지는 CommonProperties 객체의 JobParametersIncrementer에 넘겨진 Incrementer를 설정하는 것을 볼 수 있다. 이렇게 설정된 Incrementer는 build() 메서드가 실행되는 시점에 메타 정보가 넘어가면서 이 Incrementer를 가진 Job으로 생성된다. 

     

     


    RunIdIncrementer

    Incrementer는 내부적으로 getNext 메서드를 이용해, 새로운 JobParameters를 만들어 제공해준다. 아래는 RunIdIncrementer 클래스의 getNext 메서드다.

    현재 JobParameter에 key 값으로 runIdParameter 객체를 불러온다. 만약에 Null일 경우는 key 값에 1을 Value로 넣어주고, 그렇지 않을 경우 기존의 Key-Value 값에 1을 더해서 Value를 다시 넣고, 그걸 JobParameters로 만들어주는 역할을 한다. 즉, 여기서 항상 JobParameter는 이전 JobParameter보다 1이 크기 때문에 Job을 실행할 수 있게 되는 것이다. 

     


    사용자 정의 JobParameterIncrementer

    public class CustomJobParametersIncrementer implements JobParametersIncrementer {
    
        static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd-hhmmss");
    
        @Override
        public JobParameters getNext(JobParameters parameters) {
            // JobParameters 객체를 반환해야함.
            String id = format.format(new Date());
            // 기존 JobParameters의 값은 바꾸지 않아야 함.
            return new JobParametersBuilder().addString("run.id", id).toJobParameters();
    
        }
    }

    사용자 정의 JobParameterIncrementer는 JobParametersIncrementer 클래스를 구현해서 Job에 등록해주면 사용할 수 있다. 구현해야 하는 메서드는 getNext()이며, 어떻게든 매번 다른 key - value 값을 넣은 JobParameters를 만들어 돌려주면 된다. 

    위의 방법처럼 초단위로 Date를 Value로 만들어서 돌려주는 방법이 있을 수도 있고, UUID를 넘겨주는 방법도 있다. 또한, RunIdIncrementer처럼 매번 Value를 1씩 증가시켜서 JobParameters를 만드는 방법도 있다. 

     


    JobIncrementer 동작 결과

    JobIncrementer는 JobParameters에 이전과는 다른 값을 줘서 Job을 실행하게 해주는 것이다. Job Parameters가 바뀌기 때문에 새로운 JobInstance가 만들어진다. 따라서 JobInstance가 새로 만들어지고, 그에 따라 JobExecution이 새로 만들어지고, 이에 따라 JobParameters가 새로 만들어진다.

    Job 인스턴스를 보면 Job_Key가 바뀐 것을 볼 수 있다. 

    Job Parameters를 확인해보면, run.id라는 이름으로 Long_val 값이 1 → 2로 변경된 것을 볼 수 있다. 이전에 전달된 "name"에 대한 JobParameters는 동일한데 말이다. 즉, 기존의 JobParameters의 남는 곳에 적당한 Key를 계속 변경해서 넣어주면서 실행할 수 있게 된다.

     

     

     

    댓글

    Designed by JB FACTORY