Study/스프링배치 완벽 가이드

Day 6. ExecutionContext

주지민 2021. 12. 26. 21:36
반응형
스프링 배치 완벽 가이드 내용 정리입니다
3장. 예제 잡 어플리케이션은 스킵했습니다

 

http://www.yes24.com/Product/Goods/99422216

 

스프링 배치 완벽 가이드 2/e - YES24

스프링 배치의 `Hello, World!`부터 최근 플랫폼의 발전에 따른 클라우드 네이티브 기술을 활용한 배치까지 폭넓은 스프링 배치 활용 방법과 이와 관련된 유용한 내용을 다룬다. 또한 스프링 프레임

www.yes24.com


1. ExecutionContext

  • 배치 처리는 특성상 어떤 스텝이 실행중인지, 해당 스텝이 처리한 레코드 갯수등의 상태를 가지고 있다
  • 스프링 배치는 이와 같은 실행 상태를 알아서 관리해준다
  • 실제 잡 실행 시도를 나타내는 JobExecution에는 잡 상태를 저장하는 ExecutionContext를 가지고 있다
  • ExecutionContext는 배치 잡의 세션이다 ( 웹어플리케이션이 HttpSession을 사용해 상태를 저장하듯이 )
  • ExecutionContext는 간단한 key-value 쌍을 보관하는 도구
  • 잡을 다루는 과정에서 여러개가 존재할 수 있으며 스텝 실행 시도를 나타내는 StepExecution 또한 ExecutionContext을 가진다

 

2. ExecutionContext 조작해보기

  • ExecutionContext는 앞에서 설명한 JobExecution 또는 StepExecution의 일부분이다
  • 예제 코드
    // SimpleExecutionContext.java
    @RequiredArgsConstructor
    @Configuration
    public class SimpleExecutionContext {
    
        private static final String JOB_NAME = "simpleExecutionContextJob";
        private static final String STEP_NAME = "simpleExecutionContextStep";
    
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    
    
        @Bean(name = JOB_NAME)
        public Job simpleExecutionContextJob() {
            return this.jobBuilderFactory.get(JOB_NAME)
                    .start(simpleExecutionContextStep())
                    .build();
        }
    
        @Bean(name = STEP_NAME)
        public Step simpleExecutionContextStep() {
            return this.stepBuilderFactory.get(STEP_NAME)
                    .tasklet(new HelloWorld())
                    .build();
        }
    
        private static class HelloWorld implements Tasklet {
    
            private static final String HELLO_WORLD = "Hello, %s";
    
            @Override
            public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                String name = (String) chunkContext.getStepContext()
                        .getJobParameters()
                        .get("name");
                ExecutionContext executionContext = chunkContext.getStepContext()
                        .getStepExecution()
                        .getJobExecution()
                        .getExecutionContext();
                executionContext.put("user.name", name);
                System.out.println(String.format(HELLO_WORLD, name));
                return RepeatStatus.FINISHED;
            }
        }
    }​

    • JobExecution에 있는 ExecutionContext에 "user.name"을 키로하는 name값을 저장했다
    • 결과

 

728x90
반응형