[SpringBatch] @JobScope와 @StespScope 개념과 실행 예제

반응형
728x90
반응형

@JobScope와 @StepScope 개념

- 해당 어노테이션이 선언되면 생성이 어플리케이션 구동 시점이 아닌 빈의 실행 시점에 이루어진다.

스프링의 @Bean 어노테이션은 스프링이 초가화되는 시점에 빈이 생성된 후 관리된다. 스프링 배치에서 @JobScope, @StepScope 어노테이션은 어플리케이션이 실제로 실행되는 시점에 생성된다.

 

- 스코프를 프록시 모드를 기본값으로 하기 때문에, 어플리케이션 구동 시점에는 빈의 프록시 객체가 생성되어 실행 시점에 실제 빈을 호출해준다.

 

@JobScope

- Step 선언시에 사용한다.

- @Value : jobParameters, jobExecutionContext 만 사용 가능하다.

 

@StepScope

- Tasklet 이나 ItemReader, ItemWriter, ItemProcessor 선언문에 사용한다.

- @Value : jobParameter, jobExecutionContext, stepExecutionContext 사용 가능하다.

 

 

 

실행 예제

  • 실행 설정

Build and Run setting

--job.name=jobScopeStepScopeJob message=20210101

 

  • application.yml
batch:
    ...
    job:
      enabled: false # spring batch 자동실행 방지
      names: ${job.name:NONE}

 

  • - Job
    @Bean
    public Job jobScopeStepScopeJob() {
        return this.jobBuilderFactory.get("jobScopeStepScopeJob")
                /* step start */
                .start(jobScopeStepScopeStep1(null))
                .next(jobScopeStepScopeStep2())
                .listener(new JobExecutionListener() {
                    @Override
                    public void beforeJob(JobExecution jobExecution) {
                        jobExecution.getExecutionContext().putString("name", "user1");
                    }

                    @Override
                    public void afterJob(JobExecution jobExecution) {

                    }
                })
                .build();
    }

 

  • - Step1
@Value("#{jobParameters['message']}") String message
    @Bean
    @JobScope
    public Step jobScopeStepScopeStep1(@Value("#{jobParameters['message']}") String message) {
        System.out.println("message = " + message);

        return stepBuilderFactory.get("jobScopeStepScopeStep1")
                .tasklet(tasklet1(null))
                .listener(new StepExecutionListener() {
                    @Override
                    public void beforeStep(StepExecution stepExecution) {
                        stepExecution.getExecutionContext().putString("name2",  "user");
                    }

                    @Override
                    public ExitStatus afterStep(StepExecution stepExecution) {
                        return null;
                    }
                })
                .build();
    }

 

  • - Tasklet1
@Value("#{jobExecutionContext['name']}") String name
    @StepScope
    public Tasklet tasklet1(@Value("#{jobExecutionContext['name']}") String name) {
        System.out.println("name = " + name); // .putString("name", "user1");

        return (stepContribution, chunkContext) -> {
            System.out.println("tasklet1 has executed");
            return RepeatStatus.FINISHED;
        };
    }

 

  • - Step2
    @Bean
    public Step jobScopeStepScopeStep2() {
        return stepBuilderFactory.get("jobScopeStepScopeStep2")
                .tasklet(tasklet2(null))
                .build();
    }

 

  • - Tasklet2
@Value("#{stepExecutionContext['name2']}") String name2
    @StepScope
    public Tasklet tasklet2(@Value("#{stepExecutionContext['name2']}") String name2) {
        System.out.println("name2 = " + name2); // .putString("name2",  "user");

        return (stepContribution, chunkContext) -> {
            System.out.println("tasklet1 has executed");
            return RepeatStatus.FINISHED;
        };
    }

 

 

반응형

Designed by JB FACTORY