Files
spring-batch/spring-batch-docs/modules/ROOT/pages/whatsnew.adoc
2023-11-22 15:25:21 +01:00

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.