Item Reader 和 Writer 实现

在本节中,我们将介绍前面章节尚未讨论过的 reader 和 writer。

装饰器

在某些情况下,用户需要为预先存在的 ItemReader 追加特定的行为。Spring Batch 提供了一些开箱即用的装饰器,可以为你的 ItemReaderItemWriter 实现添加额外行为。

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 的实例。

ClassifierCompositeItemWriter

ClassifierCompositeItemWriter 根据提供的 Classifier 实现的路由模式,为每个 item 调用一组 ItemWriter 实现中的一个。如果所有委托对象都是线程安全的,则此实现是线程安全的。Spring Batch 提供了 ClassifierCompositeItemWriterBuilder 来构建 ClassifierCompositeItemWriter 的实例。

ClassifierCompositeItemProcessor

ClassifierCompositeItemProcessor 是一个 ItemProcessor,它根据提供的 Classifier 实现的路由模式,调用一组 ItemProcessor 实现中的一个。Spring Batch 提供了 ClassifierCompositeItemProcessorBuilder 来构建 ClassifierCompositeItemProcessor 的实例。

消息系统 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 的实例。

KafkaItemReader

KafkaItemReader 是一个用于 Apache Kafka topic 的 ItemReader。它可以配置为从同一 topic 的多个分区读取消息。它在执行上下文中存储消息偏移量以支持重启功能。Spring Batch 提供了 KafkaItemReaderBuilder 来构建 KafkaItemReader 的实例。

KafkaItemWriter

KafkaItemWriter 是一个用于 Apache Kafka 的 ItemWriter,它使用 KafkaTemplate 将事件发送到默认 topic。Spring Batch 提供了 KafkaItemWriterBuilder 来构建 KafkaItemWriter 的实例。

数据库 Reader

Spring Batch 提供了以下数据库 reader

Neo4jItemReader

Neo4jItemReader 是一个 ItemReader,它使用分页技术从图数据库 Neo4j 中读取对象。Spring Batch 提供了 Neo4jItemReaderBuilder 来构建 Neo4jItemReader 的实例。

MongoItemReader

MongoItemReader 是一个 ItemReader,它使用分页技术从 MongoDB 中读取文档。Spring Batch 提供了 MongoItemReaderBuilder 来构建 MongoItemReader 的实例。

RepositoryItemReader

RepositoryItemReader 是一个 ItemReader,它使用 PagingAndSortingRepository 读取记录。Spring Batch 提供了 RepositoryItemReaderBuilder 来构建 RepositoryItemReader 的实例。

数据库 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 的实例。

JdbcBatchItemWriter

JdbcBatchItemWriter 是一个 ItemWriter,它使用 NamedParameterJdbcTemplate 的批量处理功能,为所有提供的 item 执行批量语句。Spring Batch 提供了 JdbcBatchItemWriterBuilder 来构建 JdbcBatchItemWriter 的实例。

JpaItemWriter

JpaItemWriter 是一个 ItemWriter,它使用 JPA EntityManagerFactory 合并所有不属于持久化上下文的实体。Spring Batch 提供了 JpaItemWriterBuilder 来构建 JpaItemWriter 的实例。

特殊 Reader

Spring Batch 提供了以下特殊 reader

LdifReader

LdifReaderResource 读取 LDIF (LDAP 数据交换格式) 记录,解析它们,并为每次执行的 read 返回一个 LdapAttribute 对象。Spring Batch 提供了 LdifReaderBuilder 来构建 LdifReader 的实例。

MappingLdifReader

MappingLdifReaderResource 读取 LDIF (LDAP 数据交换格式) 记录,解析它们,然后将每个 LDIF 记录映射到一个 POJO(普通旧 Java 对象)。每次 read 返回一个 POJO。Spring Batch 提供了 MappingLdifReaderBuilder 来构建 MappingLdifReader 的实例。

AvroItemReader

AvroItemReader 从 Resource 读取序列化的 Avro 数据。每次 read 返回由 Java 类或 Avro Schema 指定的类型的实例。可以配置 reader 以选择是否在输入中嵌入 Avro schema。Spring Batch 提供了 AvroItemReaderBuilder 来构建 AvroItemReader 的实例。

特殊 Writer

Spring Batch 提供了以下特殊 writer

SimpleMailMessageItemWriter

SimpleMailMessageItemWriter 是一个可以发送邮件消息的 ItemWriter。它将实际发送消息的任务委托给 MailSender 的实例。Spring Batch 提供了 SimpleMailMessageItemWriterBuilder 来构建 SimpleMailMessageItemWriter 的实例。

AvroItemWriter

AvroItemWrite 根据给定的类型或 Schema 将 Java 对象序列化到 WriteableResource。可以配置 writer 以选择是否在输出中嵌入 Avro schema。Spring Batch 提供了 AvroItemWriterBuilder 来构建 AvroItemWriter 的实例。

特殊 Processor

Spring Batch 提供了以下特殊 processor

ScriptItemProcessor

ScriptItemProcessor 是一个 ItemProcessor,它将当前要处理的 item 传递给提供的脚本,并由 processor 返回脚本的执行结果。Spring Batch 提供了 ScriptItemProcessorBuilder 来构建 ScriptItemProcessor 的实例。