Spring Batch - 12. JobRepository

출처

목차

JobRepository

Batch 작업 중에 생성되거나 변경되는 메타데이터들을 저장하는 저장소 역할

JobRepository는 스프링 배치의 핵심 컴포넌트 중 하나로, Job을 실행하거나 재시작할 때 사용되는 메타데이터를 관리합니다. 이 메타데이터에는 Job의 실행 상태, Job의 실행에 필요한 파라미터, 실행 시간 등의 정보가 포함됩니다.

JobRepository는 Job의 실행 상태를 추적하고, Job이 실행되는 동안 발생하는 예외를 처리하고, 재시작을 위해 이전 실행 정보를 보관합니다.

  • Job 이 언제 수행됐고, 언제 끝났으며, 몇 번 실행됐고 실행에 대한 결과 등의 배치 작업 실행과 관련된 모든 Meta Data 를 저장한다.
  • JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다.

JobRepository 인터페이스

JobRepository 인터페이스는 JobInstance 와 JobExecution 을 생성하거나 기존에 생성된 객체가 을 경우 가져와 상태를 업데이트 하는 메소드를 지원한다.

public interface JobRepository {

boolean isJobInstanceExists(String jobName, JobParameters jobParameters);

JobInstance createJobInstance(String jobName, JobParameters jobParameters);

JobExecution createJobExecution(JobInstance jobInstance, JobParameters jobParameters, String jobConfigurationLocation);

JobExecution createJobExecution(String jobName, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException;

void update(JobExecution jobExecution);

void add(StepExecution stepExecution);

void addAll(Collection<StepExecution> stepExecutions);

void update(StepExecution stepExecution);

void updateExecutionContext(StepExecution stepExecution);

void updateExecutionContext(JobExecution jobExecution);

@Nullable
StepExecution getLastStepExecution(JobInstance jobInstance, String stepName);

int getStepExecutionCount(JobInstance jobInstance, String stepName);

@Nullable
JobExecution getLastJobExecution(String jobName, JobParameters jobParameters);
}

JobRepository 설정

@EnableBatchProcessing 를 선언하면 JobRepository 가 자동으로 Bean 으로 등록됩니다.

BatcConfigurer 인터페이스를 구현하거나 BasicBatchConfigurer 를 상속해서 JobRepository 설정을 커스터마이징 할 수 있습니다.

JDBC 방식으로 설정 - JobRepositoryFactoryBean

  • 내부적으로 AOP 기술을 통해 트랜잭션 처리를 해주고 있다.
  • 트랜잭션 isolation 의 기본값은 SERIALIZEBLE 로 최고 수준, 다른 레벨 (READ_COMMITED, REPEATABLE_READ) 로 지정이 가능하다.
  • 메타테이블의 Table Prefix 를 변경할 수 있다.

In Memory 방식으로 설정 - MapJobRepositoryFactoryBean

  • 성능 등의 이유로 도메인 오브젝트를 굳이 데이터 베이스에 저장하고 싶지 않은 경우
  • 보통 Test 나 프로토타입의 빠른 개발이 필요할 때 사용한다.
@Component
public class JobRepositoryListener implements JobExecutionListener {

@Autowired
private JobRepository jobRepository;

@Override
public void beforeJob(JobExecution jobExecution) {

}

@Override
public void afterJob(JobExecution jobExecution) {

String jobName = jobExecution.getJobInstance().getJobName();
JobParameters jobParameters = new JobParametersBuilder()
.addString("requestDate", "20210102")
.toJobParameters();

JobExecution lastExecution = jobRepository.getLastJobExecution(jobName, jobParameters);
if(lastExecution != null) {
for (StepExecution execution : lastExecution.getStepExecutions()) {
BatchStatus status = execution.getStatus();
System.out.println("BatchStatus = " + status.isRunning());
System.out.println("BatchStatus = " + status.name());
}
}
}
}

JobRepository 설정 변경

  • BatcConfigurer 를 구현하거나 BasicBatchConfigurer 를 상속을 통해 JobRepository 설정을 변경할 수 있다.
  • JobRepositoryFactoryBean 을 통해 DataSource , Transaction , Isolation Level 등을 설정할 수 있다.
@Configuration
public class CustomBatchConfigurer extends BasicBatchConfigurer {

private final DataSource dataSource;

protected CustomBatchConfigurer(BatchProperties properties, DataSource dataSource, TransactionManagerCustomizers transactionManagerCustomizers) {
super(properties, dataSource, transactionManagerCustomizers);
this.dataSource = dataSource;
}

@Override
protected JobRepository createJobRepository() throws Exception {

JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(getTransactionManager());
factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITED"); // isolation 수준을 변경한다.
factory.setTablePrefix("SYSTEM_"); // Spring Batch 가 사용하는 테이블 Prefix 를 설정한다. 기본값은 “BATCH_”,
factory.setMaxVarCharLength(1000); // varchar 최대 길이(기본값 2500)

return factory.getObject(); // Proxy 객체가 생성됨 (트랜잭션 Advice 적용 등을 위해 AOP 기술 적용)

}
}
Share