Item Reader and Writer Implementations
在本节中,我们将介绍前面各节中尚未讨论过的读者和编写器。
Decorators
在某些情况下,用户需要将专门的行为附加到预先存在的 ItemReader
。Spring Batch 提供了开箱即用的装饰器,可以为 ItemReader
和 ItemWriter
实现添加额外行为。
Spring Batch 包括以下装饰器:
SynchronizedItemStreamReader
当使用非线程安全的 ItemReader
时,Spring Batch 提供了 SynchronizedItemStreamReader
装饰器,该装饰器可用于使 ItemReader
线程安全。Spring Batch 提供了一个 SynchronizedItemStreamReaderBuilder
来构建 SynchronizedItemStreamReader
的实例。
例如,FlatFileItemReader
不是 线程安全的,不能在多线程步骤中使用。该读取器可以用 SynchronizedItemStreamReader
装饰,以便在多线程步骤中安全使用它。以下是如何装饰此类读取器的示例:
@Bean
public SynchronizedItemStreamReader<Person> itemReader() {
FlatFileItemReader<Person> flatFileItemReader = new FlatFileItemReaderBuilder<Person>()
// set reader properties
.build();
return new SynchronizedItemStreamReaderBuilder<Person>()
.delegate(flatFileItemReader)
.build();
}
SingleItemPeekableItemReader
Spring Batch 包含一个为 ItemReader
添加偷看方法的装饰器。此偷看方法允许用户偷看下一项。重复调用 peek 会返回同一项,并且这是从 read
方法返回的下一项。Spring Batch 提供了一个 SingleItemPeekableItemReaderBuilder
来构建 SingleItemPeekableItemReader
的实例。
SingleItemPeekableItemReader 的 peek 方法不是线程安全的,因为它不可能在多个线程中遵守 peek。执行 peek 的线程中只有一个线程会在对 read 的下一次调用中获取该项。 |
SynchronizedItemStreamWriter
当使用非线程安全的 ItemWriter
时,Spring Batch 提供了 SynchronizedItemStreamWriter
装饰器,该装饰器可用于使 ItemWriter
线程安全。Spring Batch 提供了一个 SynchronizedItemStreamWriterBuilder
来构建 SynchronizedItemStreamWriter
的实例。
例如,FlatFileItemWriter
不是 线程安全的,不能在多线程步骤中使用。该写入器可以用 SynchronizedItemStreamWriter
装饰,以便在多线程步骤中安全使用它。以下是如何装饰此类写入器的示例:
@Bean
public SynchronizedItemStreamWriter<Person> itemWriter() {
FlatFileItemWriter<Person> flatFileItemWriter = new FlatFileItemWriterBuilder<Person>()
// set writer properties
.build();
return new SynchronizedItemStreamWriterBuilder<Person>()
.delegate(flatFileItemWriter)
.build();
}
MultiResourceItemWriter
MultiResourceItemWriter
封装一个 ResourceAwareItemWriterItemStream
,并在当前资源中写入的项目计数超过 itemCountLimitPerResource
时创建一个新的输出资源。Spring Batch 提供了一个 MultiResourceItemWriterBuilder
来构建 MultiResourceItemWriter
的实例。
Messaging Readers And Writers
Spring Batch 为常用的消息系统提供以下读取器和写入器:
AmqpItemReader
AmqpItemReader
是一个 ItemReader
,它使用 AmqpTemplate
从交换中接收或转换消息。Spring Batch 提供了一个 AmqpItemReaderBuilder
来构建 AmqpItemReader
的实例。
AmqpItemWriter
AmqpItemWriter
是一个 ItemWriter
,它使用 AmqpTemplate
将消息发送到 AMQP 交换中。如果在所提供的 AmqpTemplate
中没有指定名称,则消息将发送到无名交换。Spring Batch 提供了一个 AmqpItemWriterBuilder
来构建 AmqpItemWriter
的实例。
JmsItemReader
JmsItemReader
是用于 JMS 的 ItemReader
,它使用 JmsTemplate
。模板应该有一个默认目的地,用于为 read()
方法提供项目。Spring Batch 提供了一个 JmsItemReaderBuilder
来构建 JmsItemReader
的实例。
JmsItemWriter
JmsItemWriter
是用于 JMS 的 ItemWriter
,它使用 JmsTemplate
。模板应该有一个默认目的地,用于在 write(List)
中发送项目。Spring Batch 提供了一个 JmsItemWriterBuilder
来构建 JmsItemWriter
的实例。
Database Readers
Spring Batch 提供以下数据库读取器:
Neo4jItemReader
Neo4jItemReader
是一个 ItemReader
,它通过使用分页技术从图数据库 Neo4j 读取对象。Spring Batch 提供了一个 Neo4jItemReaderBuilder
来构建 Neo4jItemReader
的实例。
MongoItemReader
MongoItemReader
是一个 ItemReader
,它通过使用分页技术从 MongoDB 读取文档。Spring Batch 提供了一个 MongoItemReaderBuilder
来构建 MongoItemReader
的实例。
HibernateCursorItemReader
HibernateCursorItemReader
是一个 ItemStreamReader
,用于读取建立在 Hibernate 之上的数据库记录。它执行 HQL 查询,然后在初始化时,随着调用 read()
方法,迭代结果集,连续返回一个与当前行相对应的对象。Spring Batch 提供了一个 HibernateCursorItemReaderBuilder
来构建 HibernateCursorItemReader
的实例。
Database Writers
Spring Batch 提供以下数据库写入器:
Neo4jItemWriter
Neo4jItemWriter
是一个 ItemWriter
实现,它写入 Neo4j 数据库。Spring Batch 提供了一个 Neo4jItemWriterBuilder
来构建 Neo4jItemWriter
的实例。
MongoItemWriter
MongoItemWriter
是一个 ItemWriter
实现,它使用 Spring Data 的 MongoOperations
的一个实现写入 MongoDB 存储。Spring Batch 提供了一个 MongoItemWriterBuilder
来构建 MongoItemWriter
的实例。
RepositoryItemWriter
RepositoryItemWriter
是 Spring Data 的 CrudRepository
的一个 ItemWriter
封装。Spring Batch 提供了一个 RepositoryItemWriterBuilder
来构建 RepositoryItemWriter
的实例。
HibernateItemWriter
HibernateItemWriter
是一个 ItemWriter
,它使用 Hibernate 会话来保存或更新不属于当前 Hibernate 会话的实体。Spring Batch 提供了一个 HibernateItemWriterBuilder
来构建 HibernateItemWriter
的实例。
Specialized Readers
Spring Batch 提供以下专门读取器:
LdifReader
LdifReader
从 Resource
中读取 LDIF(LDAP 数据交换格式)记录,对其进行解析,并为每次执行的 read
返回一个 LdapAttribute
对象。Spring Batch 提供一个 LdifReaderBuilder
,用于构建 LdifReader
实例。