179 lines
11 KiB
Plaintext
179 lines
11 KiB
Plaintext
[[whatsNew]]
|
|
= What's New in Spring Batch 5.1
|
|
|
|
This section shows the major highlights of Spring Batch 5.1. For the complete list of changes, please refer to the https://github.com/spring-projects/spring-batch/releases[release notes].
|
|
|
|
Spring Batch 5.1 includes the following features:
|
|
|
|
* xref:whatsnew.adoc#dependencies-upgrade[Dependencies upgrade]
|
|
* xref:whatsnew.adoc#virtual-threads-support[Virtual Threads support]
|
|
* xref:whatsnew.adoc#memory-management-improvement-jpaitemwriter[Memory management improvement in the JpaItemWriter]
|
|
* xref:whatsnew.adoc#new-synchronized-decorators[New synchronized decorators for item readers and writers]
|
|
* xref:whatsnew.adoc#new-cursor-based-mongo-item-reader[New Cursor-based MongoItemReader]
|
|
* xref:whatsnew.adoc#bulk-inserts-support-mongo-item-writer[Bulk inserts support in MongoItemWriter]
|
|
* xref:whatsnew.adoc#new-item-reader-and-writer-for-redis[New item reader and writer for Redis]
|
|
* xref:whatsnew.adoc#automatic-configuration-of-jobregistrybeanpostprocessor[Automatic configuration of JobRegistryBeanPostProcessor]
|
|
* xref:whatsnew.adoc#ability-to-start-a-job-flow-with-a-decision[Ability to start a job flow with a decision]
|
|
* xref:whatsnew.adoc#ability-to-provide-a-custom-jobkeygenerator[Ability to provide a custom JobKeyGenerator]
|
|
* xref:whatsnew.adoc#new-documentation-based-on-antora[New documentation based on Antora]
|
|
* xref:whatsnew.adoc#improved-getting-started-experience[Improved Getting Started experience]
|
|
|
|
Moreover, this release introduces the following experimental features:
|
|
|
|
* xref:whatsnew.adoc#mongodb-job-repository[MongoDB Job Repository]
|
|
* xref:whatsnew.adoc#composite-item-reader[Composite Item Reader]
|
|
* xref:whatsnew.adoc#new-chunk-oriented-step-implementation[New Chunk-Oriented Step Implementation]
|
|
|
|
[[dependencies-upgrade]]
|
|
== Dependencies upgrade
|
|
|
|
In this release, the Spring dependencies are upgraded to the following versions:
|
|
|
|
* Spring Framework 6.1.0
|
|
* Spring Integration 6.2.0
|
|
* Spring Data 3.2.0
|
|
* Spring LDAP 3.2.0
|
|
* Spring AMQP 3.1.0
|
|
* Spring Kafka 3.1.0
|
|
* Micrometer 1.12.0
|
|
|
|
[[virtual-threads-support]]
|
|
== Virtual Threads support
|
|
|
|
Embracing JDK 21 LTS is one of the main themes for Spring Batch 5.1, especially the support of
|
|
virtual threads from Project Loom. In this release, virtual threads can be used in all areas of the
|
|
framework, like running a concurrent step with virtual threads or launching multiple steps in parallel
|
|
using virtual threads.
|
|
|
|
Thanks to the well designed separation of concerns in Spring Batch, threads are not managed directly. Thread
|
|
management is rather delegated to `TaskExecutor` implementations from Spring Framework. This programming-to-interface
|
|
approach allows you to switch between `TaskExecutor` implementations in a transparent and a flexible way.
|
|
|
|
In Spring Framework 6.1, a new `TaskExecutor` implementation based on virtual threads has been introduced, which is the
|
|
`VirtualThreadTaskExecutor`. This `TaskExecutor` can be used in Spring Batch wherever a `TaskExecutor` is required.
|
|
|
|
[[memory-management-improvement-jpaitemwriter]]
|
|
== Memory management improvement in the JpaItemWriter
|
|
|
|
When using the `JpaItemWriter`, the JPA persistence context can quickly grow when the chunk size
|
|
is large enough. This might lead to `OutOfMemoryError` errors if not cleared appropriately in a timely manner.
|
|
|
|
In this release, a new option named `clearPersistenceContext` has been introduced in the `JpaItemWriter`
|
|
to clear the persistence context after writing each chunk of items. This option improves the memory management
|
|
of chunk-oriented steps dealing with large amounts of data and big chunk sizes.
|
|
|
|
[[new-synchronized-decorators]]
|
|
== New synchronized decorators for item readers and writers
|
|
|
|
Up to version 5.0, Spring Batch provided two decorators `SynchronizedItemStreamReader` and `SynchronizedItemStreamWriter`
|
|
to synchronize thread access to `ItemStreamReader#read` and `ItemStreamWriter#write`. Those decorators are useful when
|
|
using non thread-safe item streams in multi-threaded steps.
|
|
|
|
While those decorators work with `ItemStream` implementations, they are not usable with non-item streams. For example,
|
|
those decorators cannot be used to synchronize access to `ListItemReader#read` or `KafkaItemWriter#write`.
|
|
|
|
For users convenience, this release introduces new decorators for non-item streams as well. With this new feature, all
|
|
item readers and writers in Spring Batch can now be synchronized without having to write custom decorators.
|
|
|
|
[[new-cursor-based-mongo-item-reader]]
|
|
=== New Cursor-based MongoItemReader
|
|
|
|
Up to version 5.0, the `MongoItemReader` provided by Spring Batch used pagination, which is based on MongoDB's `skip` operation.
|
|
While this works well for small/medium data sets, it starts to perform poorly with large data sets.
|
|
|
|
This release introduces the `MongoCursorItemReader`, a new cursor-based item reader for MongoDB. This implementation
|
|
uses cursors instead paging to read data from MongoDB, which improves the performance of reads on large collections.
|
|
For consistency with other cursor/paging readers, the current `MongoItemReader` has been renamed to `MongoPagingItemReader`.
|
|
|
|
[[bulk-inserts-support-mongo-item-writer]]
|
|
=== Bulk inserts support in MongoItemWriter
|
|
|
|
Up to version 5.0, the `MongoItemWriter` supported two operations: `upsert` and `delete`. While the `upsert`
|
|
operation works well for both inserts and updates, it does not perform well for items that are known to be new
|
|
in the target collection.
|
|
|
|
Similar to the `persist` and `merge` operations in the `JpaItemWriter`, this release adds a new operation named
|
|
`insert` in the `MongoItemWriter`, which is designed for bulk inserts. This new option performs better than
|
|
`upsert` for new items as it does not require an additional lookup to check if items already exist in the target collection.
|
|
|
|
[[new-item-reader-and-writer-for-redis]]
|
|
=== New item reader and writer for Redis
|
|
|
|
A new `RedisItemReader` is now available in the library of built-in item readers. This reader is based on Spring Data Redis
|
|
and can be configured with a `ScanOptions` to scan the key set to read from Redis.
|
|
|
|
Similarly, a new `RedisItemWriter` based on Spring Data Redis is now part of the writers library. This writer can be configured
|
|
with a `RedisTemplate` to write items to Redis.
|
|
|
|
[[automatic-configuration-of-jobregistrybeanpostprocessor]]
|
|
=== Automatic configuration of JobRegistryBeanPostProcessor
|
|
|
|
When configuring a `JobOperator` in a Spring Batch application, it is necessary to register the jobs in the operator's `JobRegistry`.
|
|
This registration process is either done manually or automatically by adding a `JobRegistryBeanPostProcessor` bean to the application
|
|
context.
|
|
|
|
In this release, the default configuration of Spring Batch (ie by using `@EnableBatchProcessing` or extending `DefaultBatchConfiguration`)
|
|
now automatically registers a `JobRegistryBeanPostProcessor` bean to the application context. This simplifies the configuration process
|
|
and improves the user experience when using a `JobOperator`.
|
|
|
|
[[ability-to-start-a-job-flow-with-a-decision]]
|
|
=== Ability to start a job flow with a decision
|
|
|
|
When using the XML configuration style, it is possible to start a job flow with a decider thanks to the `<decision>` element.
|
|
However, up to version 5.0, it was not possible to achieve the same flow definition with the Java API.
|
|
|
|
In this release, a new option to start a job flow with a `JobExecutionDecider` was added to the `JobBuilder` API.
|
|
This makes both configuration styles more consistent.
|
|
|
|
[[ability-to-provide-a-custom-jobkeygenerator]]
|
|
=== Ability to provide a custom JobKeyGenerator
|
|
|
|
By default, Spring Batch identifies job instances by calculating an MD5 hash of the identifying job parameters. While it is unlikely to
|
|
need to customize this identification process, Spring Batch still provide a strategy interface for users to override the default mechanism
|
|
through the `JobKeyGenerator` API.
|
|
|
|
Up to version 5.0, it was not possible to provide a custom key generator without having to create a custom `JobRepository` and `JobExplorer`.
|
|
In this version, it is now possible to provide a custom `JobKeyGenerator` through the factory beans of `JobRepository` and `JobExplorer`.
|
|
|
|
[[new-documentation-based-on-antora]]
|
|
=== New documentation based on Antora
|
|
|
|
The reference documentation was updated to use https://antora.org[Antora]. This update introduces a number of improvements, including but not limited to:
|
|
|
|
* Multi-version documentation: it is now possible to navigate from one version to another thanks to the drop down version list in the left side menu.
|
|
* Integrated search experience: powered by https://docsearch.algolia.com/[Algolia], the search experience in now better thanks to the integrated search box at the top left of the page
|
|
* Improved configuration style toggle: the toggle to switch between the XML and Java configuration styles for code snippets is now located near each sample, rather than the top of each page
|
|
|
|
[[improved-getting-started-experience]]
|
|
=== Improved Getting Started experience
|
|
|
|
In this release, the getting started experience was improved in many ways:
|
|
|
|
* Samples are now packaged by feature and are provided in two configuration styles: XML and Java configuration
|
|
* A new https://github.com/spring-projects/spring-batch#two-minutes-tutorial[Two minutes tutorial] was added to the README
|
|
* The https://spring.io/guides/gs/batch-processing[Getting Started Guide] was updated to the latest and greatest Spring Batch and Spring Boot versions
|
|
* The https://github.com/spring-projects/spring-batch/blob/main/ISSUE_REPORTING.md[Issue Reporting Guide] was updated with detailed instructions and project templates to help you easily report issues
|
|
|
|
[[mongodb-job-repository]]
|
|
=== MongoDB Job Repository (Experimental)
|
|
|
|
This feature introduces new implementations of `JobRepository` and `JobExplorer` backed by MongoDB. This long-awaited feature is now available
|
|
as experimental and marks the introduction of the first NoSQL meta-data store for Spring Batch.
|
|
|
|
Please refer to the https://github.com/spring-projects-experimental/spring-batch-experimental#mongodb-job-repository[Spring Batch Experimental] repository for more details about this feature.
|
|
|
|
[[composite-item-reader]]
|
|
=== Composite Item Reader (Experimental)
|
|
|
|
This feature introduces a composite `ItemReader` implementation. Similar to the `CompositeItemProcessor` and `CompositeItemWriter`, the idea is to delegate reading to a list of item readers in order.
|
|
This is useful when there is a requirement to read data having the same format from different sources (files, databases, etc).
|
|
|
|
Please refer to the https://github.com/spring-projects-experimental/spring-batch-experimental#composite-item-reader[Spring Batch Experimental] repository for more details about this feature.
|
|
|
|
[[new-chunk-oriented-step-implementation]]
|
|
=== New Chunk-Oriented Step implementation (Experimental)
|
|
|
|
This is not a new feature, but rather a new implementation of the chunk-oriented processing model.
|
|
The goal is to address the reported issues with the current implementation and to provide a new base for the upcoming re-designed concurrency model.
|
|
|
|
Please refer to the https://github.com/spring-projects-experimental/spring-batch-experimental#new-chunk-oriented-step-implementation[Spring Batch Experimental] repository for more details about this new implementation. |