spring-batchspring
Spring Batch 6에서 메타데이터가 안 쌓일 때
Spring Batch로 정산 잡을 옮기고 나서 이상한 걸 발견했다. 잡은 잘 도는데 BATCH_JOB_EXECUTION 테이블이 텅 비어 있고, jobExecutionId가 매번 1이다.
원인: 기본값이 인메모리로 바뀌었다
Spring Batch 6부터 기본 JobRepository가 ResourcelessJobRepository(인메모리)다. 예전처럼 DataSource가 있으면 알아서 JDBC로 붙는 게 아니다.
더 헷갈리는 건:
@EnableBatchProcessing에dataSourceRef속성이 없다 (컴파일 에러)- Boot의
spring.batch.jdbc.*프로퍼티도 없다 - 그냥
jobRepository빈을 등록하면 BeanDefinitionOverrideException
해결: DefaultBatchConfiguration 상속
@Configuration
public class BatchConfig extends DefaultBatchConfiguration {
private final DataSource dataSource;
private final PlatformTransactionManager txManager;
@Override
@Bean
public JobRepository jobRepository() throws Exception {
var factory = new JdbcJobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(txManager);
factory.afterPropertiesSet();
return factory.getObject();
}
@Override
protected PlatformTransactionManager getTransactionManager() {
return txManager;
}
}
스키마는 spring-batch-core jar 안의 schema-postgresql.sql을 꺼내 Flyway 마이그레이션으로 넣었다. 자동 초기화에 기대는 것보다 버전 관리가 되는 쪽이 낫다.
확인
SELECT job_execution_id, status, exit_code
batch_job_execution create_time ;
조회 1