⭐ New features
- Allow to use Mongo
JobRepositorywith anyPlatformTransactionManager#5508 - Add a builder for
ResourcesItemReaderwith support for specifying resources via a pattern #5487 - Introduce
BatchConstants#5190 - Default reader/writer name to the bean name #5149
- Support specifying resource locations using a pattern in
MultiResourceItemReaderBuilder#5056 - Add support for custom collection prefix in MongoDB Job repository #4980
- Add compile-time safety for mutually exclusive builder methods #4888
- Add schema locations to
DatabaseTypeto prevent typos in the metadata tables string path #4586
🐞 Bug fixes
- Repository/DAO-level count methods cannot soundly validate job/step existence #5544
@OnSkipInRead/@OnSkipInProcess/@OnSkipInWritemethods are ignored byChunkOrientedStepBuilder#listener(Object)#5531- Rolled-back chunk counted as written and step COMPLETED in
ChunkOrientedStep(fault-tolerant retry ofOptimisticLockException) #5509 TransientTransactionErrorinMongoSequenceIncrementerduring parallel job executions #5507- Fix QName deserialization in
JacksonExecutionContextStringSerializer#5502 ChunkOrientedStepscan mode passes the processed chunk toChunkListener#beforeChunkand silently drops scan items when the listener throws #5493ChunkOrientedStepdoes not re-invoke theItemProcessorduring chunk scanning, unlikeFaultTolerantChunkProcessor#5490JpaCursorItemReader.doClose()missing null check on entityManager #5486- Fix incorrect nullability contract for encoding in
StaxEventItemReader#5483 JsonFunctionalTestsfails on Windows due to CRLF #5481@OnChunkErroris never invoked on a chunk-oriented step #5468- Interface listener callbacks are invoked twice when an item handler also has a listener annotation #5466
spring.batch.job.launch.countis silently missing: theJobOperatorkeepsObservationRegistry.NOOPon most configuration paths #5463- Inconsistent JobParameter type handling between storage and retrieval in Spring Batch 6.x #5455
@BeforeStep/@AfterStepmethods are ignored byChunkOrientedStepBuilder#listener(Object)#5451- Replace jetbrains
@NotNullwith jspecify@NonNull#5443 SimpleJobOperator.restart(JobExecution)masks the real failure reason with a misleading "job execution already running" message #5439- Missing GraalVM runtime hints for MongoDB persistence model classes and resources #5435
- Fix
JsonFileItemWriterto produce valid JSON when append allowed with custom header/footer callback #5432 - Step name is null when the step is not defined as a bean and not assigned a name #5278
- Forced Sort Passing via
sorts()Method When Building withMongoCursorItemReaderBuilderand Query #4860 - Incorrect invocation order of job execution listener in remote partitioning #4133
- Remote-chunking implementation does not support parallel executions of the same job #1372
🚀 Enhancements
- Remove redundant methods which are identical to default method #5516
- Inconsistent builder method name:
MultiResourceItemReaderBuilder.setStrict()#5512 - Improve
DefaultJobParametersConverterandJsonJobParametersConverter#5457 - Replace
isAssignableFrom()withisInstance()where feasible #5427 - Remove unused
ClassUtilsimport fromJdbcPagingItemReader#5407 - Add
@FunctionalInterfacetoStepInterruptionPolicy#5402 - Fix
SimpleJobOperatorjobRegistry state message #5369 - Replace deprecated
Jackson2JsonMessageConverterwithJacksonJsonMessageConverter#5350 - Replace
System.getProperty("line.separator")withSystem.lineSeparator()#5341 - Remove unnecessary null check against createTime of execution #5304
- Inaccurate exception message when attempting to start a running job #5280
- Improve
JacksonExecutionContextStringSerializer#5233 - Replace custom converters with
DefaultFormattingConversionService#5186 - Move async processing APIs to
spring-batch-core#5185 - Replace
CopyOnWriteArrayListwithArrayListinJdbcPagingItemReaderandJpaPagingItemReaderfor performance and correctness #5112 - Add flushing support in
RepositoryItemWriter#5073
📔 Documentation
- Fix Javadoc #5545
- Inaccurate documentation of remote chunking and remote partitioning samples regarding JMS headers #5513
- Fix typos in Javadoc comments #5511
- Clarify retryable reads compatibility with forward-only semantics #5510
- Clarify
SkipListenercontract and reference docs about transaction scope #5494 - Reference documentation's tracing example registers a handler that creates no spans and fails the job #5475
- Fix typo in Javadoc of
JobOperator.start()#5434 - Wrong example in
Registering ItemStream with a Step#5429 - Fix incorrect Javadoc reference in
JobExecution.isStopped()#5414 - Fix javadoc in
SqlPagingQueryUtils#5403 - Fix typo in
EnableBatchProcessingJavadoc #5375 - Inaccurate JavaDoc of
BatchStatus.isLessThanOrEqualTo#5285 - Enhance documentation about leveraging
IteratorItemReaderto reuse scrolling APIs from Spring Data #4484
🔨 Tasks
- Consistently use .version suffix for version properties in pom.xml #5506
- Update Apache Artemis groupId to
org.apache.artemis#5482 - Update Groovy version to 5.1.2 #5327
- Deprecate
JobExecutionconvenience getters forJobInstanceid #5533 - Deprecate
setRepositoryinRepositoryItemWriter#5473 - Deprecate
setRepositoryandsetSortsinRepositoryItemReader#5472 - Deprecate Derby support since Apache Derby is retired #5254
- Deprecate
JobInstance::getInstanceIdfor removal to eliminate redundancy #5244 - Deprecate
StepExecutionconvenience getters forJobExecutionid and parameters #5142 - Deprecate
setEntityManagerFactoryin JPA item readers/writer #5101
🆙 Dependency Upgrades
Spring Framework: 7.1.0-M2
Spring Integration: 7.2.0-M2
Spring AMQP: 4.2.0-M2
Spring Kafka: 4.2.0-M2
Spring Data: 2026.1.0-M2
Micrometer: 1.18.0-M2
❤️ Contributors
Thank you to all the contributors who worked on this release:
@acktsap, @apptie, @banseok1216, @benelog, @cladren123, @dhritimanchakra, @DragonFSKY, @enduf7686, @GaBaljaintheroom, @Gorock, @hutiefang76, @HyunWoo9930, @jjh75607, @KMGeon, @klopfdreh, @kojw1017, @kyungrae, @leedaegeon, @leestana01, @maequise, @mjd507, @noojung, @quaff, @scordio, @snowykte0426, @UsmanEjaz10, @won-seoop, @xxxxxxjun, and @yuseogi0218