티스토리 뷰
Spring Batch 5.0이 출시되고 배치 잡 환경 설정에 변화가 생겼습니다.
1. Batch Job 설정 변화
첫번째로 신규 @EnableBatchProcessing 속성이 추가되었고
jobRepository에 공통 Datasource와 transactionManager를 명시적으로 지정이 가능해졌습니다.
@Configuration
@EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
public class MyJobConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("myJob", jobRepository)
//define job flow as needed
.build();
}
}
두 번째로 신규 DefaultBatchConfiguration이 추가되고, Batch Configuration Class에 상속하면 기본적인 Batch Bean들을 만들어 주고 @EnableBatchProcessing 대안으로 사용이 가능합니다.
@Configuration
class EmployeeJobConfig : DefaultBatchConfiguration(){
@Bean
fun myJob(
jobRepository: JobRepository,
myStep: Step
): Job {
return JobBuilder("myJob", jobRepository)
.preventRestart()
.incrementer(SampleIncrementer())
.start(myStep)
.build()
}
}
추가적으로 JobBuilderFactory와 StepBuilderFactory 빈을 더 이상 사용하지 않고 JobBuilder와 StepBuilder를 사용합니다.
2. 바뀐대로 수정했는데 왜 배치가 작동 안 하지?
저의 케이스로는 배치를 사용할 때 이벤트 배치가 아닌 스케줄 배치로 이용하기 때문에 배치 애플리케이션이 실행 후 job이 실행되고 종료하는 형태가 돼야 합니다.
하지만 위처럼 어떤 케이스도 설정 후 application을 실행했을 때 배치 잡이 실행되지 않았습니다.
이유를 확인해 보니 Spring Boot Auto Configure에서 배치가 있으면 실행할 수 있도록 로직이 되어있는데 Spring Boot 3.0부터 DefaultBatchConfiguration 클래스나 EnableBatchProcessing 어노테이션을 선언할 경우 자동 실행 하는 것을 막는 로직이 생겨버렸네요.
org.spring.boot.autoconfigure.btach.BatchAutoConfiguration 참고
@AutoConfiguration(after = { HibernateJpaAutoConfiguration.class, TransactionAutoConfiguration.class })
@ConditionalOnClass({ JobLauncher.class, DataSource.class, DatabasePopulator.class })
@ConditionalOnBean({ DataSource.class, PlatformTransactionManager.class })
@ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class)
@EnableConfigurationProperties(BatchProperties.class)
@Import(DatabaseInitializationDependencyConfigurer.class)
public class BatchAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getName();
if (StringUtils.hasText(jobNames)) {
runner.setJobName(jobNames);
}
return runner;
}
...
}
@ConditionalOnMissingBean이 추가되어 DefaultBatchConfiguration, EnableBatchProcessing이 있을 경우 실행에 필요한 JobLauncherApplicationRunner도 생성이 되지 않습니다.
버그라고 봐야 하나?
3. 해결
JobLauncherApplicationRunner가 없으니 그대로 하나 만들어서 해결했습니다.
@Configuration
@EnableConfigurationProperties(BatchProperties::class)
class BatchConfig {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = ["enabled"], havingValue = "true", matchIfMissing = true)
fun jobLauncherApplicationRunner(
jobLauncher: JobLauncher, jobExplorer: JobExplorer,
jobRepository: JobRepository, properties: BatchProperties
): JobLauncherApplicationRunner {
val runner = JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository)
val jobName: String? = properties.job.name
if (!jobName.isNullOrEmpty()) {
runner.setJobName(jobName)
}
return runner
}
}
'Back-End > Spring' 카테고리의 다른 글
Spring HATEOAS 적용 (0) | 2020.05.20 |
---|