You will be fine

<Spring Batch> 1. JobParameters, ExecutionContext

by BFine
반응형

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

 

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

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

www.yes24.com

 

가. JobParameters

 a. Mysql 설정 유의

  -  Table 'batch.batch_job_instance' doesn't exist 

     => 단순 datasource 설정만 할경우 배치관련 스키마가 생성되지 않기때문에 발생하는 오류

  -  yml 설정에 spring.batch.jdbc.initialize-schema=always 추가해야함

@Slf4j
@EnableBatchProcessing
@RequiredArgsConstructor
@Configuration
public class BatchExample {
 
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;
 
    @Bean
    public Step step(){
      return stepBuilderFactory.get("Step 이름")
       .tasklet(new Tasklet() {
            @Override
             public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                  log.info(" ##### Step 실행 ##### ");
                  return RepeatStatus.FINISHED;
            }
         }).build();
    }
 
    @Bean
    public Job job(Step step){
        return jobBuilderFactory.get("Job 이름").start(step).build();
    }
}

 b. JobParameters 전달

  -  JobInstance는 Job 이름과 식별 파라미터로 식별한다.

  -  즉 argument가 있는 경우에는 같은 Job으로 보기때문에 재실행시에는 오류가 발생한다. 

argument : foo=bar

  -  Job에 파라미터를 전달은 JobLauncherApplicationRunner 이용해 이루어진다.

      => 책에는 JobLauncherCommandLineRunner 이지만 boot 2.3 버전부터 Deprecated 되었다.

argument : data(long)=1

  -  JobLauncherApplicationRunnerSpringApplication으로 부터 argument 전달 받는다.
  -  Converter를 통해 JobParameters로 변환되며 key값 뒤에 타입을 명시해서 사용할 수가 있다.
      => 식별 파라미터로 사용하지 않을 경우에는 -를 붙여주면 된다.

  -  JobParameters Map<String, JobParameter> 형태로 argument 값을 저장한다.

 c. JobParameters 접근

  - 예제의 tasklet 구현부를 보면 excute 메서드에 StepContributionChunkContext를 볼 수 있다.

       1. StepContribution : 커밋되지않은 현재 트랙잭션에 대한 정보를 가지고 있다. 

       2. ChunkContext     : 실행시점에 Job 상태를 제공 및 처리중인 Chunk의 정보를 가지고 있다.

  -  ChunkContext에는 StepContext에 대한 참조가 있어 이를 통해 JobParameters에 접근할 수 있다.

  -  @Value를 이용하여 Bean 생성시에 주입해주는 방법이 있다. #{jobParameters[이름]} 형태로 사용가능

      => 이때 Scope를 사용하여 Lazy 로딩으로 Bean을 생성한다.(Step의 실행 범위에 들어갈때까지 지연)

  -  메서드로 Bean을 사용할 경우에는 null을 추가해주면 되긴 하지만 먼가 보기 좋지 않다. ;;
  -  아예 JobParameters를 가져오는 Bean 클래스를 만들어 주는 방법도 있다.

 

나. ExecutionContext

 a. 무엇인가

  -  배치처리는 상태를 가지고 있어야 한다.
       => ex. 어떤 Step이 실행되고 있고 어디서 실패했는지, 레코드 개수는 몇개 인지 등

  -  ExecutionContext는 이러한 데이터를 Key-Value 형태로 저장할 수 있는 공간이다.

      => 모든 사항들이 JobRepository에 저장되어 안전하다. 
  -  기본적으로 Web의 세션과 동일하지만 여러개가 존재할 수 있다는 차이가 있다.

  -  Job과 Step은 ExecutionContext 각각 가지며  Execution에 해당 참조를 가지고 있다.

 

 b. 조작하는 방법

@Override
public RepeatStatus execute(StepContribution contribution,
      ChunkContext chunkContext) throws Exception {


      ExecutionContext jobExecutionContext = chunkContext.getStepContext()
                                              .getStepExecution()
                                              .getJobExecution()
                                              .getExecutionContext();

   
       Map<String, Object> entryMap = chunkContext.getStepContext()
       									.getJobExecutionContext();

       ExecutionContext stepExecutionContext = chunkContext.getStepContext()
                                                        .getStepExecution()
                                                        .getExecutionContext();

       jobExecutionContext.put("foo","bar");

	  return RepeatStatus.FINISHED;
}

  -  ChunkContext를 통해 ExecutionContext에 접근할 수 있다. 

  -  getJobExecutionContext() 으로 바로 Map에 접근이 가능하지만 수정해도 반영되지않는다.

      => 해당부분은 복사해서 새롭게 Map을 만들어주기 떄문이다.

 

 c. BATCH_JOB_EXECUTION_CONTEXT 테이블

  -  ExecutionContext에 저장한 데이터들은 EXECUTION_CONTEXT 테이블에 저장된다.

  -  위의 코드를 실행하면 SHORT_CONTEXT에 JSON 형태로 저장된다.

  -  SERIALIZED_CONTEXT 에는 잡이 실행 중이거나 실패한 경우에만 직렬화 객체가 저장된다. 

 

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기