跳到主要内容
版本:5.2.1

项读取器和写入器实现

QWen Plus 中英对照 Item Reader and Writer Implementations

在本节中,我们将向您介绍在前几节中尚未讨论过的读写器。

装饰器​

在某些情况下,用户需要为现有的 ItemReader 添加专用行为。Spring Batch 提供了一些开箱即用的装饰器,可以为您的 ItemReader 和 ItemWriter 实现添加额外的行为。

Spring Batch 包含以下装饰器:

SynchronizedItemStreamer​

当使用一个非线程安全的 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 操作的正确性。只有其中一个执行了 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 的实例。

ClassifierCompositeItemWriter​

ClassifierCompositeItemWriter 根据通过提供的 Classifier 实现的路由器模式,为每个项目调用一组 ItemWriter 实现中的一个。如果所有委托都是线程安全的,则该实现也是线程安全的。Spring Batch 提供了 ClassifierCompositeItemWriterBuilder 用于构建 ClassifierCompositeItemWriter 的实例。

ClassifierCompositeItemProcessor​

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

消息读取器和写入器​

Spring Batch 为常用的 messaging 系统提供了以下的读取器和写入器:

AmqpItemReader​

AmqpItemReader 是一个使用 AmqpTemplate 从交换机接收或转换消息的 ItemReader。Spring Batch 提供了 AmqpItemReaderBuilder 用于构建 AmqpItemReader 的实例。

AmqpItemWriter​

AmqpItemWriter 是一个使用 AmqpTemplate 将消息发送到 AMQP 交换机的 ItemWriter。如果在提供的 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 的实例。

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

JdbcBatchItemWriter​

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

JpaItemWriter​

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

专用读取器​

Spring Batch 提供了以下专用读取器:

LdifReader​

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

MappingLdifReader​

MappingLdifReader 从 Resource 中读取 LDIF(LDAP 数据交换格式)记录,解析它们,然后将每个 LDIF 记录映射到一个 POJO(Plain Old Java Object)。每次读取返回一个 POJO。Spring Batch 提供了一个 MappingLdifReaderBuilder 来构建 MappingLdifReader 的实例。

AvroItemReader​

AvroItemReader 从资源中读取序列化的 Avro 数据。每次读取返回由 Java 类或 Avro Schema 指定的类型的实例。该读取器可以可选地配置为处理嵌入了 Avro schema 的输入或不嵌入 schema 的输入。Spring Batch 提供了一个 AvroItemReaderBuilder 用于构建 AvroItemReader 的实例。

专业化写手​

Spring Batch 提供以下专用的 writer:

SimpleMailMessageItemWriter​

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

AvroItemWriter​

AvroItemWrite 根据给定的类型或 Schema 将 Java 对象序列化到 WriteableResource。该写入器可以可选地配置为在输出中嵌入 Avro schema 或不嵌入。Spring Batch 提供了 AvroItemWriterBuilder 用于构建 AvroItemWriter 的实例。

专用处理器​

Spring Batch 提供以下专用处理器:

ScriptItemProcessor​

ScriptItemProcessor 是一个 ItemProcessor,它将当前待处理的项传递给所提供的脚本,脚本的执行结果由处理器返回。Spring Batch 提供了一个 ScriptItemProcessorBuilder 用于构建 ScriptItemProcessor 的实例。