项目读取器和写入器实现

在本节中,我们将向您介绍在前面各节中尚未讨论过的读取器和写入器。

装饰器

在某些情况下,用户需要将专门的行为附加到预先存在的 ItemReader。Spring Batch 提供了一些开箱即用的装饰器,可以为您的 ItemReaderItemWriter 实现添加其他行为。

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 方法。此 peek 方法允许用户提前查看一项。对 peek 的重复调用将返回相同的项,这将是 read 方法返回的下一项。Spring Batch 提供了一个 SingleItemPeekableItemReaderBuilder 来构造 SingleItemPeekableItemReader 的实例。

SingleItemPeekableItemReader 的 peek 方法不是线程安全的,因为无法在多个线程中保留 peek。在对 read 的下一次调用中,只有其中一个 peek 的线程才能获得该项。

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

ClassifierCompositeItemWriter

ClassifierCompositeItemWriter 基于通过提供的 Classifier 实现的路由器模式,为每个项目调用 ItemWriter 实现的集合之一。如果所有委托都是线程安全的,则该实现是线程安全的。Spring Batch 提供了一个 ClassifierCompositeItemWriterBuilder 来构造 ClassifierCompositeItemWriter 的实例。

ClassifierCompositeItemProcessor

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

消息读取器和写入器

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

KafkaItemReader

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

KafkaItemWriter

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

数据库读取器

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

HibernatePagingItemReader

HibernatePagingItemReader 是一个用于读取数据库记录的 ItemReader,它构建在 Hibernate 之上,并且每次只读取固定数量的项目。Spring Batch 提供了一个 HibernatePagingItemReaderBuilder 来构建 HibernatePagingItemReader 的实例。

RepositoryItemReader

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

数据库写入器

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

JdbcBatchItemWriter

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

JpaItemWriter

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

专用读取器

Spring Batch 提供以下专用读取器

LdifReader

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

MappingLdifReader

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

AvroItemReader

AvroItemReader 从 Resource 读取序列化后的 Avro 数据。每次读取都返回由 Java 类或 Avro 模式指定的类型的实例。可以可选地配置读取器以用于嵌入 Avro 模式的输入或不嵌入 Avro 模式的输入。Spring Batch 提供了一个 AvroItemReaderBuilder 来构建 AvroItemReader 的实例。

专用写入器

Spring Batch 提供以下专用写入器

SimpleMailMessageItemWriter

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

AvroItemWriter

AvroItemWrite 根据给定的类型或模式将 Java 对象序列化到 WriteableResource。可以可选地配置写入器以将 Avro 模式嵌入到输出中或不嵌入。Spring Batch 提供了一个 AvroItemWriterBuilder 来构建 AvroItemWriter 的实例。

专用处理器

Spring Batch 提供以下专用处理器

ScriptItemProcessor

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