Item Reader 和 Writer 实现
在本节中,我们将介绍前面章节尚未讨论过的 reader 和 writer。
装饰器
在某些情况下,用户需要为预先存在的 ItemReader
追加特定的行为。Spring Batch 提供了一些开箱即用的装饰器,可以为你的 ItemReader
和 ItemWriter
实现添加额外行为。
Spring Batch 包含以下装饰器
SynchronizedItemStreamReader
当使用非线程安全的 ItemReader
时,Spring Batch 提供了 SynchronizedItemStreamReader
装饰器,可用于使 ItemReader
线程安全。Spring Batch 提供了 SynchronizedItemStreamReaderBuilder
来构建 SynchronizedItemStreamReader
的实例。
例如,FlatFileItemReader
不是线程安全的,不能用于多线程 Step。可以通过 SynchronizedItemStreamReader
装饰此 reader,以便在多线程 Step 中安全地使用它。这里是如何装饰此类 reader 的示例
@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 方法。此 peek 方法允许用户提前查看一个 item。重复调用 peek 会返回相同的 item,并且这是从 read
方法返回的下一个 item。Spring Batch 提供了 SingleItemPeekableItemReaderBuilder
来构建 SingleItemPeekableItemReader
的实例。
SingleItemPeekableItemReader 的 peek 方法不是线程安全的,因为在多个线程中无法保证 peek 的结果。只有其中一个 peek 过的线程会在下一次调用 read 时获取到该 item。 |
SynchronizedItemStreamWriter
当使用非线程安全的 ItemWriter
时,Spring Batch 提供了 SynchronizedItemStreamWriter
装饰器,可用于使 ItemWriter
线程安全。Spring Batch 提供了 SynchronizedItemStreamWriterBuilder
来构建 SynchronizedItemStreamWriter
的实例。
例如,FlatFileItemWriter
不是线程安全的,不能用于多线程 Step。可以通过 SynchronizedItemStreamWriter
装饰此 writer,以便在多线程 Step 中安全地使用它。这里是如何装饰此类 writer 的示例
@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
,并在当前资源中写入的 item 数量超过 itemCountLimitPerResource
时创建一个新的输出资源。Spring Batch 提供了 MultiResourceItemWriterBuilder
来构建 MultiResourceItemWriter
的实例。
消息系统 Reader 和 Writer
Spring Batch 为常用的消息系统提供了以下 reader 和 writer
AmqpItemReader
AmqpItemReader
是一个 ItemReader
,它使用 AmqpTemplate
从 exchange 接收或转换消息。Spring Batch 提供了 AmqpItemReaderBuilder
来构建 AmqpItemReader
的实例。
AmqpItemWriter
AmqpItemWriter
是一个 ItemWriter
,它使用 AmqpTemplate
将消息发送到 AMQP exchange。如果在提供的 AmqpTemplate
中未指定名称,消息将发送到无名 exchange。Spring Batch 提供了 AmqpItemWriterBuilder
来构建 AmqpItemWriter
的实例。
JmsItemReader
JmsItemReader
是一个用于 JMS 的 ItemReader
,它使用 JmsTemplate
。该 template 应有一个默认目的地,用于为 read()
方法提供 item。Spring Batch 提供了 JmsItemReaderBuilder
来构建 JmsItemReader
的实例。
JmsItemWriter
JmsItemWriter
是一个用于 JMS 的 ItemWriter
,它使用 JmsTemplate
。该 template 应有一个默认目的地,用于在 write(List)
中发送 item。Spring Batch 提供了 JmsItemWriterBuilder
来构建 JmsItemWriter
的实例。
数据库 Reader
Spring Batch 提供了以下数据库 reader
Neo4jItemReader
Neo4jItemReader
是一个 ItemReader
,它使用分页技术从图数据库 Neo4j 中读取对象。Spring Batch 提供了 Neo4jItemReaderBuilder
来构建 Neo4jItemReader
的实例。
数据库 Writer
Spring Batch 提供了以下数据库 writer
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
的实例。
特殊 Reader
Spring Batch 提供了以下特殊 reader
LdifReader
LdifReader
从 Resource
读取 LDIF (LDAP 数据交换格式) 记录,解析它们,并为每次执行的 read
返回一个 LdapAttribute
对象。Spring Batch 提供了 LdifReaderBuilder
来构建 LdifReader
的实例。