Download Latest Version v6.0.0 source code.tar.gz (8.6 MB)
Email in envelope

Get an email when there's a new version of Spring Batch

Home / v6.0.0
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2025-11-19 16.4 kB
v6.0.0 source code.tar.gz 2025-11-19 8.6 MB
v6.0.0 source code.zip 2025-11-19 10.8 MB
Totals: 3 Items   19.5 MB 0

Spring Batch 6.0 is a major release that comes with several new features, enhancements, and bug fixes. This release introduces a number of API breaking changes and deprecations. Please refer to the migration guide for the full list of changes.

:star: New features

  • Migrate to JSpecify annotations for nullability constraints #4673
  • Add API to recover failed job executions #4876
  • Add support for observability with the Java Flight Recorder #4972
  • Add ability to externally stop any kind of step #4965
  • Revisit the concurrency model #4955
  • Use contextual lambdas to configure batch artefacts [#4818]
  • Add support for local chunking [#5021]
  • Add support for remote step executions [#5024]
  • Add shutdown hook to gracefully stop job executions on sigterm [#5028]
  • Add support for Jackson 3 [#4842]
  • Support SEDA with Spring Integration MessageChannels [#4719]
  • Introduce a modern command line batch operator #4899
  • Add ability to use bean names for jobs and steps #4858
  • Make MapJobRegistry smart enough to auto register jobs defined in the application context #4855
  • Make MessageChannelPartitionHandler usable with any job repository implementations #4917
  • Add optimistic locking for meta-data deletion [#4793]
  • Make Job interface a functional interface #4966
  • Make Step interface a functional interface #4976
  • Add StepExecution parameter to StoppableTasklet.stop() #4703
  • Add ability to configure Mongo sequence incrementers #5018
  • Remove usage of Micrometer's global static meter registry #4968
  • Add support for delete operations in MongoDB DAOs [#5060]
  • Use existing ItemWriter with CompositeItemWriter expecting different item types [#4735]
  • Automatically register ItemHandler as StepListener instead of only StepExecutionListener in ChunkOrientedStepBuilder [#5087]

:rocket: Enhancements

  • Improve experience when configuring an alternative JobRepository #4718
  • Improve performance of JdbcStepExecutionDao::getStepExecution [#4799]
  • Improve update sql for optimistic locking [#4792]
  • Improve JobOperator API by using domain types instead of primitive types #4845
  • Improve JobOperator by reducing its scope to job operations only #4833
  • Core API simplification #4847
  • Move core APIs in dedicated packages #4877
  • Move listener APIs under core.listener package #4867
  • Move core.explore package under core.repository #4827
  • Move core partitioning APIs under org.springframework.batch.core.partition #4849
  • Move DAOs implementations to separate packages #4848
  • Remove unnecessary generic from JobKeyGenerator interface #4886
  • Remove usage of JobFactory in `JobRegistry`` #4854
  • Remove dependency to JobExplorer in SimpleJobOperator #4817
  • Remove JobExplorer bean registration from the default batch configuration #4825
  • Remove unnecessary reflection in RemoteChunkHandlerFactoryBean [#4839]
  • Rename SimpleJobOperator to TaskExecutorJobOperator #4834
  • Rename JobRepositoryFactoryBean to JdbcJobRepositoryFactoryBean #4829
  • FlatFileItemReaderBuilder : raise check exception on build #4757
  • Make JobOperator extend JobLauncher #4832
  • Make JobRepository extend JobExplorer #4824
  • Redundant methods in JobExplorer/JobInstanceDao APIs #4821
  • Introduce ErrorProne, fix compiler warnings [#4807]
  • Add Redis integration tests [#4892]
  • Fail test if no exception is thrown in testErrorMessageWhenNoLineTokenizerWasProvided [#4883]
  • Refactor AOT proxy hints for better type safety [#4881]
  • Refactor ExitStatus#isRunning for type-safety [#4783]
  • Mark argument to ExitStatus#equals as nullable [#4823]
  • Use typesafe variant of ctx::getBean instead [#4803]
  • Use jdbcTemplate.queryForStream().findFirst() where appropriate [#4802]
  • Reuse existing SQL where feasible [#4801]
  • Revisit the chunk-oriented processing model implementation #3950
  • Allow a StepInterruptionPolicy to be injected through the step builder #1641
  • Make JobRegistry optional in the default batch configuration #4971
  • Make transaction manager optional in JobOperatorFactoryBean #4970
  • Make transaction manager optional in Tasklet and Chunk-Oriented steps #4974
  • Segregate StepLocator methods in a sub interface #5015
  • Move infrastructure APIs under a specific package #5014
  • Revisit exception declaration in public APIs #5013
  • Move built-in job parameter incrementers to the org.springframework.batch.core.job.parameters package #5011
  • Broken encapsulation of job parameter attributes #5010
  • Incorrect nullability definition in public APIs input #4989
  • Update retrieval methods with clear nullability semantics #4988
  • Incorrect default constructor in AbstractStep #4984
  • Make domain model entities immutable #1870
  • Improve performance of JdbcStepExecutionDao::getLastStepExecution [#4798]
  • Optimize step executions counting in MongoStepExecutionDao [#5061]
  • Change configuration log level to debug [#5055]
  • Remove unused id from persistence domain object [#5054]
  • Missing comma in StepExecution#getSummary [#5025]
  • Improve performance of DefaultFieldSet.indexOf() method [#4930]
  • Improve MessageChannelPartitionHandler::receiveReplies [#4776]
  • CommandLineJobOperator improve state validation for restart/abandon and enhance logging [#5057]
  • Inaccurate error message when using ResourcelessJobRepository with a partitioned step [#4732]
  • SQL Server DDL for metadata tables should use NVARCHAR to prevent performance degradation and deadlocks from implicit conversion [#5064]
  • Potential parameter key collision in .getUniqueJobParameters() [#5088]

:lady_beetle: Bug fixes

  • RecordFieldExtractor in FlatFileItemWriterBuilder doesn't reflect names() setting [#4916]
  • Incorrect warning when starting a job with an empty parameters set #4914
  • Incorrect handling of job parameters when using a JobParametersIncrementer #4910
  • Write Skip Count Not Updated in Chunk Processing #4514
  • Build failure with GraalVM 24 #4937
  • Incorrect step execution id generation in ResourcelessJobRepository #4975
  • Conflicting info in @AfterChunk/@BeforeChunk annotation javadoc to current implementation #4961
  • RecordFieldSetMapper fails with Record without components #4900
  • JsonObjectReader fails to read JSON array format due to Jackson 3.0 FAIL_ON_TRAILING_TOKENS default change [#5047]
  • ChunkOrientedStep: Unnecessary ItemReader.read() calls when chunk size exceeds item count [#5048]
  • JobParameter constructor validates wrong parameter (value instead of name) [#5049]
  • Incorrect error message in JobOperatorTestUtils constructor [#5051]
  • ChunkOrientedStepBuilder throws IllegalArgumentException when retry() is used(configured) without retryLimit() [#5068]
  • ChunkOrientedStepBuilder throws IllegalArgumentException when skip() is used(configured) without skipLimit() [#5069]
  • MongoJobExecutionDao doesn't handle temporal job parameter types correctly [#5063]
  • Incorrect Step status in StepExecutionListener#afterStep [#4362]
  • Cannot deserialize TopicPartition from JobRepository [#3797]
  • Incorrect restart behaviour with no identifying job parameters [#4755]
  • Incorrect ordering when retrieving job executions with JobExecutionDao [#5062]
  • Errors are not propagated from job execution [#808]
  • Spring batch terminate in started status after sigterm [#4023]
  • Jdbc Hibernate Connection closed prematurly when launching a Job [#5006]
  • OptimisticLockingFailureException caused by jobExecutionDao.updateJobExecution(jobExecution) [#5022]
  • Missing GraalVM native image hints for StepContext.getJobParameters() [#5041]
  • StepBuilder(JobRepository) fails due to timing mismatch between constructor validation and BeanNameAware [#5027]
  • RecursiveCollectionLineAggregator.aggregate() fails on empty collection input [#5023]
  • Incorrect retrieval of last step execution with MongoDB [#4896]
  • Fix potential NPE in JdbcJobExecutionDao [#5044]
  • Error in the metrics registration with a meter registry customization #4759
  • Activation of Actuator & Prometheus rise a WARN in the log due to bad configuration #4753
  • ChunkOrientedStepBuilder: Default SkipPolicy should be NeverSkipItemSkipPolicy when only retry is configured (not AlwaysSkipItemSkipPolicy) [#5077]
  • ChunkOrientedStepBuilder: All Throwables (including Errors) are retried when only retryLimit() is configured without retry() [#5078]
  • ChunkOrientedStep does not throw exception when skipPolicy.shouldSkip() returns false [#5079]
  • ChunkOrientedStepBuilder does not apply StepBuilderHelper properties (allowStartIfComplete, startLimit, stepExecutionListeners) [#5093]
  • ChunkOrientedStep: Retry exhausted in ItemWriter always triggers Chunk Scanning regardless of skip eligibility [#5091]
  • JobLauncherTestUtils throws an NPE at getJobLauncher() in Batch 6 RC2 [#5090]

📖 Documentation updates

  • Documentation for disabling spring batch metrics is incomplete #4800
  • Polish code block style and fix typo in whatsnew.adoc #4901
  • Fix javadoc in JdbcCursorItemReaderBuilder #4838
  • Correct comment in RemoteChunkingJobFunctionalTests [#4822]
  • Include Javadocs as part of Antora docs
  • FaultTolerantStepBuilder#skipLimit Javadoc is misleading with custom skipPolicy [#4963]
  • Fix grammar error in testing documentation [#4979]
  • Improve javadoc of JobInstanceDao#getJobNames method [#5043]
  • Elaborate usage of PlatformTransactionManager [#4787]
  • Document requirements of CommandLineJobOperator in the reference docs [#5026]
  • Clarify MongoDB job repository configuration in reference documentation [#4859]
  • Unclear reference to example about job parameters in reference documentation [#4791]

🆙 Dependency Upgrades

  • Spring Framework: 7.0.0
  • Spring Integration: 7.0.0
  • Spring AMQP: 4.0.0
  • Spring Kafka: 4.0.0
  • Spring Data: 4.0.0
  • Spring Ldap: 4.0.0
  • Micrometer: 1.16.0

:hammer: Tasks

  • Add integration tests for DDL migration scripts [#4289]
  • Replace usage of JobExplorer with JobRepository in RemoteStepExecutionAggregator #4928
  • Replace usage of JobExplorer with JobRepository in SystemCommandTasklet #4927
  • Replace usage of JobLauncher with JobOperator in JobLaunchingGateway and JobLaunchingMessageHandler #4924
  • Replace usage of JobLauncher with JobOperator in JobStep #4923
  • Replace usage of JobExplorer with JobRepository in StepExecutionRequestHandler #4918
  • Rename JobLauncherTestUtils to JobOperatorTestUtils #4920
  • Rename JobExplorerFactoryBean to JdbcJobExplorerFactoryBean #4846
  • Deprecate StepRunner #4921
  • Deprecate modular job configuration through EnableBatchProcessing #4866
  • Remove usage of JobExplorer in BatchIntegrationConfiguration #4919
  • Remove deprecated APIs scheduled for removal in v6 #4819
  • Update GraalVM runtime hints #4844
  • Deprecate JobRepository#getStepExecution(long jobExecutionId, long stepExecutionId) #5007
  • Deprecate the batch XML namespace #4843
  • Deprecate JUnit 4 support #4816
  • Update Micrometer's Prometheus support to version 1.x #4689

:heart: Contributors

Many thanks to all contributors who made this release possible!

@darth-raijin, @itis821, @jbotuck, @martinfrancois, @noojung, @patrickwinti, @sieunie, @sjiwon, @therepanic, @thelightway24, @ch200203, @monnetchr, @Chienlin1014, @lucas-gautier, @PENEKhun, @kyb4312.

A special thanks to @scordio , @quaff and @KILL9-NO-MERCY for their amazing feedback and numerous contributions 🙏

Source: README.md, updated 2025-11-19