-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Spring Batch 6.0 Migration Guide
❗ This document is still in progress. We will update it regularly for each milestone version until the GA is released ❗
This document is meant to help you migrate your applications to Spring Batch 6.0. Spring Batch 6 does not change the minimum required Java version which remains Java 17+.
Spring Batch 6 upgrades its Spring dependencies to the following versions:
- Spring Framework 7
- Spring Integration 7
- Spring Data 4
- Spring AMQP 4
- Spring for Apache Kafka 4
- Micrometer 1.16
Before v6, the @EnableBatchProcessing annotation was tied to a JDBC-based infrastructure. This is not the case anymore. Two new annotations have been introduced to configure the underlying job repository: @EnableJdbcJobRepository and EnableMongoJobRepository.
Starting from v6, @EnableBatchProcessing allows you to configure common attributes for the batch infrastructure, while store-specific attributes can be specified with the new dedicated annotations. Here is an example to migrate a JDBC configuration from v5 to v6:
// v5
@EnableBatchProcessing(dataSourceRef = "batchDataSource", taskExecutorRef = "batchTaskExecutor")
class MyJobConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("job", jobRepository)
// job flow omitted
.build();
}
}// v6
@EnableBatchProcessing(taskExecutorRef = "batchTaskExecutor")
@EnableJdbcJobRepository(dataSourceRef = "batchDataSource")
class MyJobConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("job", jobRepository)
// job flow omitted
.build();
}
}Similar to the annotation-based approach, the programmatic model based on DefaultBatchConfiguration has been updated by introducing two new configuration classes to define store-specific attributes: JdbcDefaultBatchConfiguration and MongoDefaultBatchConfiguration.
Here is an example to migrate a JDBC configuration from v5 to v6:
// v5
class MyJobConfiguration extends DefaultBatchConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("job", jobRepository)
// job flow omitted
.build();
}
@Override
protected DataSource getDataSource() {
return new MyBatchDataSource();
}
}// v6
class MyJobConfiguration extends JdbcDefaultBatchConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("job", jobRepository)
// job flow omitted
.build();
}
@Override
protected DataSource getDataSource() {
return new MyBatchDataSource();
}
}- The
DefaultBatchConfigurationnow configures a "resourceless" batch infrastructure (ie aResourcelessJobRepositoryand aResourcelessTransactionManager). This is to remove the need for an additional dependency to an in-memory database for those who do not need batch meta-data. - The configuration of a
JobExplorerbean has been removed. This is due to the fact thatJobRepositorynow extendsJobExplorerand there is no need for aJobExplorerbean anymore, which is now deprecated (See "Deprecated APIs" section). - The configuration of a
JobLauncherhas been replaced with aJobOperator. This is due to the fact thatJobOperatornow extendsJobLauncherand there is no need for aJobLauncherbean anymore, which is now deprecated (See "Deprecated APIs" section). - The configuration of a
JobRegistrySmartInitializingSingletonbean has been removed. TheMapJobRegistryis now optional as well , and is smart enough to populate itself with jobs from the application context on startup.JobRegistrySmartInitializingSingletonis now deprecated (See "Deprecated APIs" section). - The configuration of a transaction manager in
JobOperatorFactoryBeanis now optional - The configuration of a transaction manager in tasklet and chunk-oriented steps is now optional
The following APIs have been deprecated in version 6.0:
FaultTolerantStepBuilderSimpleStepBuilderBatchListenerFactoryHelperFaultTolerantStepFactoryBeanSimpleStepFactoryBeanBatchRetryTemplateChunkMonitorChunkOrientedTaskletChunkProcessorChunkProviderDefaultItemFailureHandlerFaultTolerantChunkProcessorFaultTolerantChunkProviderKeyGeneratorSimpleChunkProcessorSimpleChunkProviderSimpleRetryExceptionHandlerLimitCheckingItemSkipPolicy-
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean: renamed toJdbcJobRepositoryFactoryBean -
org.springframework.batch.core.repository.explore.support.JobExplorerFactoryBean: renamed toJdbcJobExplorerFactoryBean org.springframework.batch.core.configuration.annotation.AutomaticJobRegistrarBeanPostProcessororg.springframework.batch.core.configuration.support.AbstractApplicationContextFactoryorg.springframework.batch.core.configuration.support.ApplicationContextFactoryorg.springframework.batch.core.configuration.support.ApplicationContextJobFactoryorg.springframework.batch.core.configuration.support.AutomaticJobRegistrarorg.springframework.batch.core.configuration.support.ClasspathXmlApplicationContextsFactoryBeanorg.springframework.batch.core.configuration.support.GenericApplicationContextFactoryorg.springframework.batch.core.configuration.support.JobFactoryRegistrationListenerorg.springframework.batch.core.configuration.support.ReferenceJobFactoryorg.springframework.batch.core.configuration.JobFactoryorg.springframework.batch.core.configuration.JobLocatororg.springframework.batch.core.configuration.ListableJobLocatororg.springframework.batch.core.configuration.support.JobLoaderorg.springframework.batch.core.configuration.support.DefaultJobLoaderorg.springframework.batch.core.launch.support.CommandLineJobRunnerorg.springframework.batch.core.launch.support.JvmSystemExiterorg.springframework.batch.core.launch.support.RuntimeExceptionTranslatororg.springframework.batch.core.launch.support.SystemExiterorg.springframework.batch.core.launch.support.TaskExecutorJobLauncherorg.springframework.batch.core.launch.JobLauncherorg.springframework.batch.core.repository.explore.support.AbstractJobExplorerFactoryBeanorg.springframework.batch.core.repository.explore.support.JdbcJobExplorerFactoryBeanorg.springframework.batch.core.repository.explore.support.JobExplorerFactoryBeanorg.springframework.batch.core.repository.explore.support.MongoJobExplorerFactoryBeanorg.springframework.batch.core.repository.explore.support.SimpleJobExplorerorg.springframework.batch.core.repository.explore.JobExplorerorg.springframework.batch.core.resource.StepExecutionSimpleCompletionPolicyorg.springframework.batch.support.PropertiesConverterorg.springframework.batch.test.StepRunnerorg.springframework.batch.item.SkipWrapper
StepBuilder#chunk(int chunkSize, PlatformTransactionManager transactionManager)StepBuilder#chunk(CompletionPolicy completionPolicy, PlatformTransactionManager transactionManager)StoppableTasklet#stop()JobExplorer#isJobInstanceExists(String jobName, JobParameters jobParameters)JobExplorer#findJobExecutions(JobInstance jobInstance)JobExplorer#findJobInstancesByJobName(String jobName, int start, int count)JobExplorer#findJobInstancesByName(String jobName, int start, int count)SimpleJobExplorer#findJobInstancesByJobName(String jobName, int start, int count)JobInstanceDao#findJobInstancesByName(String jobName, final int start, final int count)JdbcJobInstanceDao#findJobInstancesByName(String jobName, final int start, final int count)MongoJobInstanceDao#findJobInstancesByName(String jobName, final int start, final int count)JobOperator#getExecutions(long instanceId)JobOperator#getJobInstances(String jobName, int start, int count)JobOperator#getJobInstance(String jobName, JobParameters jobParameters)JobOperator#getRunningExecutions(String jobName)JobOperator#getParameters(long executionId)JobOperator#getSummary(long executionId)JobOperator#getStepExecutionSummaries(long executionId)JobOperator#start(String jobName, Properties parameters)JobOperator#getJobNamesJobOperator#restart(long executionId)JobOperator#startNextInstance(String jobName)JobOperator#stop(long executionId)JobOperator#abandon(long jobExecutionId)SimpleJobOperator#start(String jobName, Properties parameters)SimpleJobOperator#getJobNamesSimpleJobOperator#restart(long executionId)SimpleJobOperator#startNextInstance(String jobName)SimpleJobOperator#stop(long executionId)SimpleJobOperator#abandon(long jobExecutionId)SimpleJobOperator#getExecutions(long instanceId)SimpleJobOperator#getJobInstances(String jobName, int start, int count)SimpleJobOperator#getJobInstance(String jobName, JobParameters jobParameters)SimpleJobOperator#getRunningExecutions(String jobName)SimpleJobOperator#getParameters(long executionId)SimpleJobOperator#getSummary(long executionId)SimpleJobOperator#getStepExecutionSummaries(long executionId)SimpleJobOperator#setJobParametersConverter(JobParametersConverter jobParametersConverter)DefaultBatchConfiguration#getJobParametersConverter()EnableBatchProcessing#modularChunk#Chunk(List<? extends W> items, List<SkipWrapper<W>> skips)Chunk#getSkips()Chunk#getErrors()Chunk#skip(Exception e)Chunk#getSkipsSize()Chunk#isEnd()Chunk#setEnd()Chunk#isBusy()Chunk#setBusy(boolean)Chunk#clearSkips()Chunk#getUserData()Chunk#setUserData(Object)Chunk#chunk(CompletionPolicy, PlatformTransactionManager)ChunkListener#beforeChunk(ChunkContext)ChunkListener#afterChunk(ChunkContext)ChunkListener#afterChunkError(ChunkContext)CompositeChunkListener#beforeChunk(ChunkContext)CompositeChunkListener#afterChunk(ChunkContext)CompositeChunkListener#afterChunkError(ChunkContext)
Please refer to the Javadoc of each API for more details about the suggested replacement.
- All APIs under
org.springframework.batch.core.explorepackage have been moved underorg.springframework.batch.core.repository.explore -
JdbcExecutionContextDao,JdbcJobExecutionDao,JdbcJobInstanceDaoandJdbcStepExecutionDaohave been moved fromorg.springframework.batch.core.repository.daotoorg.springframework.batch.core.repository.dao.jdbc -
MongoExecutionContextDao,MongoJobExecutionDao,MongoJobInstanceDao,MongoStepExecutionDaoandMongoSequenceIncrementerhave been moved fromorg.springframework.batch.core.repository.daotoorg.springframework.batch.core.repository.dao.mongo -
Partitioner,PartitionNameProvider,PartitionStepandStepExecutionAggregatorhave been moved fromorg.springframework.batch.core.partition.supporttoorg.springframework.batch.core.partition -
ChunkListener,ItemProcessListener,ItemReadListener,ItemWriteListener,JobExecutionListener,SkipListener,StepExecutionListenerandStepListenerhave been moved fromorg.springframework.batch.coretoorg.springframework.batch.core.listener -
Job,JobExecution,JobExecutionException,JobInstance,JobInterruptedException,JobKeyGenerator,DefaultJobKeyGenerator,StartLimitExceededExceptionandUnexpectedJobExecutionExceptionhave been moved fromorg.springframework.batch.coretoorg.springframework.batch.core.job -
CompositeJobParametersValidator,DefaultJobParametersValidator,JobParameter,JobParameters,JobParametersBuilder,JobParametersIncrementer,JobParametersInvalidExceptionandJobParametersValidatorhave been moved fromorg.springframework.batch.coretoorg.springframework.batch.core.job.parameters -
Step,StepContributionandStepExecutionhave been moved fromorg.springframework.batch.coretoorg.springframework.batch.core.step
The following APIs were deprecated in previous versions and have been removed in this release:
- method
org.springframework.batch.core.configuration.support.DefaultBatchConfiguration#getLobHandler - Attribute
lobHandlerRefin@EnableBatchProcessing - Attribute
lob-handlerin XML elementstep - method
org.springframework.batch.core.repository.dao.JdbcExecutionContextDao#setLobHandler - method
org.springframework.batch.core.repository.dao.JdbcJobInstanceDao#setJobIncrementer - method
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean#setLobHandler - method
org.springframework.batch.core.configuration.support.DefaultBatchConfiguration#jobLauncher - method
org.springframework.batch.core.configuration.support.DefaultBatchConfiguration#jobOperator - method
org.springframework.batch.core.configuration.support.DefaultBatchConfiguration#jobRegistryBeanPostProcessor - class
org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor - method
org.springframework.batch.core.explore.support.JobExplorerFactoryBean#setLobHandler - constructor
org.springframework.batch.core.job.builder.JobBuilder#JobBuilder(String name) - class
org.springframework.batch.core.listener.ChunkListenerSupport - class
org.springframework.batch.core.listener.JobExecutionListenerSupport - class
org.springframework.batch.core.listener.SkipListenerSupport - class
org.springframework.batch.core.listener.StepExecutionListenerSupport - method
org.springframework.batch.core.step.builder.AbstractTaskletStepBuilder#throttleLimit - constructor
org.springframework.batch.core.step.builder.StepBuilder#StepBuilder(String name) - method
org.springframework.batch.core.step.builder.TaskletStepBuilder#tasklet(Tasklet tasklet) - method
org.springframework.batch.core.step.factory.SimpleStepFactoryBean#setThrottleLimit - classes
org.springframework.batch.item.data.MongoItemReaderandorg.springframework.batch.item.data.builder.MongoItemReaderBuilder - method
org.springframework.batch.item.data.MongoItemWriter#setDelete - method
org.springframework.batch.item.data.builder.MongoItemWriterBuilder#delete(boolean delete) - class
org.springframework.batch.item.data.Neo4jItemReaderandorg.springframework.batch.item.data.Neo4jItemWriter - method
org.springframework.batch.item.database.support.SqlPagingQueryUtils#generateLimitGroupedSqlQuery(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, String limitClause) - class
org.springframework.batch.item.database.support.SqlWindowingPagingQueryProvider - class
org.springframework.batch.repeat.listener.RepeatListenerSupport - method
org.springframework.batch.repeat.support.TaskExecutorRepeatTemplate#setThrottleLimit - class
org.springframework.batch.support.SystemPropertyInitializer - constructor
org.springframework.batch.integration.chunk.RemoteChunkingManagerStepBuilder#RemoteChunkingManagerStepBuilder(String stepName) - method
org.springframework.batch.integration.chunk.RemoteChunkingManagerStepBuilder#RemoteChunkingManagerStepBuilder repository(JobRepository jobRepository) - constructor
org.springframework.batch.integration.partition.RemotePartitioningManagerStepBuilder#RemotePartitioningManagerStepBuilder(String stepName) - constructor
org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#RemotePartitioningWorkerStepBuilder(String name) - method
org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#RemotePartitioningWorkerStepBuilder repository(JobRepository jobRepository) - method
org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#tasklet(Tasklet tasklet) - method
org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#chunk(CompletionPolicy completionPolicy)
- The setter
org.springframework.batch.core.step.job.JobStep#setJobLauncher(JobLauncher jobLauncher)was renamed tosetJobOperator(JobOperator jobOperator)and now requires aJobOperatorinstead of aJobLauncher - The setter
org.springframework.batch.core.step.builder.JobStepBuilder#launcher(JobLauncher jobLauncher)was renamed tooperator(JobOperator jobOperator)and now requires aJobOperatorinstead of aJobLauncher - The attribute
job-launcherof the XML elementstep.jobinspring-batch.xsdwas renamed tojob-operatorand now requires aJobOperatorinstead of aJobLauncher - The constructor
org.springframework.batch.integration.launch.JobLaunchingGateway(JobLauncher jobLauncher)now accepts aJobOperatorinstead of aJobLauncher -
org.springframework.batch.integration.launch.JobLaunchingMessageHandler(JobLauncher jobLauncher)now accepts aJobOperatorinstead of aJobLauncher - The attribute `` of the XML element
job-launching-gatewayin `spring-batch-integration.xsd` was renamed to `job-operator` and now requires a `JobOperator` instead of a `JobLauncher` - The setter
org.springframework.batch.core.step.tasklet.SystemCommandTasklet#setJobExplorer(JobExplorer jobExplorer)was renamed tosetJobRepository(JobRepository jobRepository)and now requires aJobRepositoryinstead of aJobExplorer - The constructor
org.springframework.batch.core.partition.support.RemoteStepExecutionAggregator(JobExplorer jobExplorer)now accepts aJobRepositoryinstead of aJobExplorer - The setter
org.springframework.batch.core.partition.support.RemoteStepExecutionAggregator#setJobExplorer(JobExplorer jobExplorer)was renamed tosetJobRepository(JobRepository jobRepository)and now requires aJobRepositoryinstead of aJobExplorer