What’s New in Spring Batch 4.3
This release comes with a number of new features, performance improvements, dependency updates and API deprecations. This section describes the most important changes. For a complete list of changes, please refer to the release notes.
New features
New synchronized ItemStreamWriter
Similar to the SynchronizedItemStreamReader
, this release introduces a
SynchronizedItemStreamWriter
. This feature is useful in multi-threaded steps
where concurrent threads need to be synchronized to not override each other’s writes.
New JpaQueryProvider for named queries
This release introduces a new JpaNamedQueryProvider
next to the
JpaNativeQueryProvider
to ease the configuration of JPA named queries when
using the JpaPagingItemReader
:
JpaPagingItemReader<Foo> reader = new JpaPagingItemReaderBuilder<Foo>()
.name("fooReader")
.queryProvider(new JpaNamedQueryProvider("allFoos", Foo.class))
// set other properties on the reader
.build();
New JpaCursorItemReader Implementation
JPA 2.2 added the ability to stream results as a cursor instead of only paging.
This release introduces a new JPA item reader that uses this feature to
stream results in a cursor-based fashion similar to the JdbcCursorItemReader
and HibernateCursorItemReader
.
New JobParametersIncrementer implementation
Similar to the RunIdIncrementer
, this release adds a new JobParametersIncrementer
that is based on a DataFieldMaxValueIncrementer
from Spring Framework.
GraalVM Support
This release adds initial support to run Spring Batch applications on GraalVM. The support is still experimental and will be improved in future releases.
Java records Support
This release adds support to use Java records as items in chunk-oriented steps.
The newly added RecordFieldSetMapper
supports data mapping from flat files to
Java records, as shown in the following example:
@Bean
public FlatFileItemReader<Person> itemReader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personReader")
.resource(new FileSystemResource("persons.csv"))
.delimited()
.names("id", "name")
.fieldSetMapper(new RecordFieldSetMapper<>(Person.class))
.build();
}
In this example, the Person
type is a Java record defined as follows:
public record Person(int id, String name) { }
The FlatFileItemReader
uses the new RecordFieldSetMapper
to map data from
the persons.csv
file to records of type Person
.
Performance improvements
Use bulk writes in RepositoryItemWriter
Up to version 4.2, in order to use CrudRepository#saveAll
in RepositoryItemWriter
,
it was required to extend the writer and override write(List)
.
In this release, the RepositoryItemWriter
has been updated to use
CrudRepository#saveAll
by default.
Use bulk writes in MongoItemWriter
The MongoItemWriter
used MongoOperations#save()
in a for loop
to save items to the database. In this release, this writer has been
updated to use org.springframework.data.mongodb.core.BulkOperations
instead.
Job start/restart time improvement
The implementation of JobRepository#getStepExecutionCount()
used to load
all job executions and step executions in-memory to do the count on the framework
side. In this release, the implementation has been changed to do a single call to
the database with a SQL count query in order to count step executions.
Dependency updates
This release updates dependent Spring projects to the following versions:
-
Spring Framework 5.3
-
Spring Data 2020.0
-
Spring Integration 5.4
-
Spring AMQP 2.3
-
Spring for Apache Kafka 2.6
-
Micrometer 1.5
Deprecations
API deprecation
The following is a list of APIs that have been deprecated in this release:
-
org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean
-
org.springframework.batch.core.explore.support.MapJobExplorerFactoryBean
-
org.springframework.batch.core.repository.dao.MapJobInstanceDao
-
org.springframework.batch.core.repository.dao.MapJobExecutionDao
-
org.springframework.batch.core.repository.dao.MapStepExecutionDao
-
org.springframework.batch.core.repository.dao.MapExecutionContextDao
-
org.springframework.batch.item.data.AbstractNeo4jItemReader
-
org.springframework.batch.item.file.transform.Alignment
-
org.springframework.batch.item.xml.StaxUtils
-
org.springframework.batch.core.launch.support.ScheduledJobParametersFactory
-
org.springframework.batch.item.file.MultiResourceItemReader#getCurrentResource()
-
org.springframework.batch.core.JobExecution#stop()
Suggested replacements can be found in the Javadoc of each deprecated API.
SQLFire support deprecation
SQLFire has been in EOL since November 1st, 2014. This release deprecates the support of using SQLFire as a job repository and schedules it for removal in version 5.0.