티스토리 뷰

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함