반응형

Job

  • 가장 상위 개념, 하나의 배치작업 자체
  • 전체적으로 설정하고 명세한 객체
  • 여러 step을 포함하고 있는 컨테이너, 반드시 한 개 이상의 step으로 구성해야 함
  • 최상위 인터페이스
  • 기본 구현체:
    • SimpleJob: 순차적으로 step을 실행시키는 job. 모든 job에서 유용하게 사용할 수 있는 표준 기능을 가지고 있음. steps 리스트 안에 step 객체를 가지고 있음
    • FlowJob: 특정한 조건과 흐름에 따라 step을 구성하여 실행시킴, 더 유연, 조건과 흐름에 따라 구성을 다르게 할 수 있음. flow 객체를 실행히켜서 작업을 진행

 

JobInstance

  • job이 실행될 때 만들어지는 논리적 실행 단위
  • job의 설정과 구성은 동일하지만 job이 실행되는 시점에 처리하는 내용(jobParameter)은 다르기 때문에 job의 실행을 구분해야 함
  • job : jobInstance = 1 : M

 

JobParameter

  • job 실행 시 함께 포함하여 사용하는 파라미터 객체
  • 하나의 job에 존재할 수 있는 여러 jobInstance를 구분하기 위한 용도
  • jobParameter : jobInstance = 1 : 1
  • STRING, DATE, LONG, DOUBLE 타입 제공

바인딩 방법

  • jar 실행 시 주입
    • java -jar dd.jar requestDate=111
  • 코드로 생성
    • JobParameterBuilder, DefaultJobParametersConverter
  • SpEL 이용
    • @Value("#{jobParameter[requestDate]}")

 

참고) jar 실행 시 주입 하는 방법으로 테스트 해봤더니 아래와 같은 오류가 난다. 

libs % java -jar springbatch-test-0.0.1-SNAPSHOT.jar name=user3 seq(long)=1L date(date)=2021/02/03 age(double)=12.34
zsh: no matches found: seq(long)=1L
아래와 같이 escape 해주면 해결..
java -jar batch.jar executionDate\(date\)=2021/02/21
or
java -jar batch.jar 'executionDate(date)=2021/02/21'

 

 

JobExecution

  • jobInstance에 대한 한 번의 시도를 의미하는 객체. job이 실행될 때 마다 생성되며 job 실행 중에 발생한 정보를 저장하는 객체
  • jobExecution은 FAILED or COMPLETED 등의 job 실행 결과를 가지고 있음
  • COMPLETED가 될 때 까지 하나의 jobInstance 내에서 여러번 시도가 생길 수 있음
  • JobInstance : JobExecution = 1 : M

 

Step

  • job을 구성하는 독립적인 하나의 단계로 실제 배치 처리를 정의하고 컨트롤하는데 필요한 모든 정보를 가진 객체
  • 배치 작업을 어떻게 구성하고 실행할지 세부작업을 task기반으로 설정하고 명세해 놓은 객체
  • 비지니스 로직을 담음
  • 기본 구현체 
    • taskletStep : 기본이 되는 클래스, 구현체 제어
    • partitionStep : 멀티 스레드 방식, step을 여러 개로 분리해서 실행
    • jobStep : step 내에서 job을 실행하도록 함, chaining
    • flowStep : step 내에서 flow를 실행하게 함

 

StepExecution

  • step에 대한 한 번의 시도를 의미하는 객체, step 실행 중에 발생한 정보를 저장하는 객체
  • 각 step별로 생성, step이 실제로 시작되었을 때만 생성
  • job이 실패해 재시작하더라도 이미 성공한 step은 재실행되지 않고 실패한 step만 실행됨(실패하면 그 이후 step은 실행되지 않고 종료)
  • 모든 stepExecution이 성공해야 jobExecution도 정상적으로 완료
  • JobExecution : StepExecution =  1 : M

 

StepContribution

  • 청크 프로세스의 변경사항을 버퍼링한 수 stepExecution상태를 업데이트하는 도메인 객체
  • 청크 커밋 직전에 stepExecution의 apply 메서드를 호출하여 상태를 업데이트
  • exitStatus의 기본 종료토드 외 사용자 정릐 종료코드를 생성해서 적용할 수 있음
  • stepExecution 객체 안에 있음

 

ExecutionContext

  • map의 형태로 stepExecution 이나 jobExecution 객체의 상태를 저장하는 공유 객체; 유지 관리에 필요한 키-값 저장
  • DB에는 직렬화 한 값으로 저장됨({"키":"값"})
  • 공유 범위
    • step: 각 step의 stepExecution에 저장되며 step간 공유 안 됨
    • job: 각 job의 jobExecution에 저장되며 job간 공유 안되고 job의 step간에는 서로 공유 됨
      • job 재시작 시 이미 처리한 데이터는 건너뛰고 이후를 수행하도록할 때 상태정 보를 활용 

 

JobRepository

  • 배치 작업 중 정보를 저장하는 저장소, 인터페이스; simpleJobRepository 구현체 있고, 커스텀 가능
  • job이 언제 수행되었고 언제 끝났고 몇 번 실행되었고 등 메타데이터를 저장함
  • @EnableBatchProcessing 어노테이션만 선언하면 job repository가 자동으로 빈으로 생성됨
  • jdbc 방식
    • JobRepostioryFactoryBean
    • 내부적으로 aop를 통해 트랜잭션 처리 해주고 있음
    • 트랜잭션 isolation 기본 값은 serializable로 최고 수준이지만 다른 레벨로도 지정 가능
    • 메타테이블 테이블 prefix가 기본으로는 BATCH_ 이지만 수정 가능
  • in memory 방식
    • MapJobRepositoryFactoryBean
    • 성능 등의 이유로 굳이 DB에 넣고 싶지 않은 경우
    • test나 프로토타입의 빠른 개발이 필요할 때 사용

 

JobLauncher

  • job을 실행하는 역할
  • job과 JobParameter를 인자로 받아 요청된 배치 작업을 수행한 후 jobExecution을 반환
  • 부트가 구동되면 jobLauncher 빈이 자동 생성됨
  • job 실행
    • 동기적 실행: SyncTaskExecutor
      • 모든 단계를 다 마친 후에 jobExecution 반환
      • 스케줄러에 의한 배치 처리에 적합
      • 배치 처리 시간이 길어도 상관 없을 경우
    • 비동기적 실행: SimpleAsyncTaskExecutor
      • jobExecution을 생성하고 획득, 획득하자마자 반환(exitStauts.UNKNOWN) , 배치 완료
      • http 요청에 의한 배치처리에 적합; 배치처리 시간이 길 경우 응답이 늦어지지 않도록 함
       

728x90
반응형

'개발 > spring-batch' 카테고리의 다른 글

[spring-batch] 소개  (0) 2023.12.04
[spring-batch] simpleJob  (0) 2022.05.26
[spring-batch] application.yml 설정 값  (0) 2022.05.25
[spring-batch] h2 연결 및 설정  (0) 2022.05.23
[spring-batch] 기초  (0) 2022.05.20

+ Recent posts