跳到主要内容

项读取器和写入器实现

QWen Plus 中英对照 Item Reader and Writer Implementations

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

装饰器

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

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();
}
java

SingleItemPeekableItemReader

Spring Batch 包含一个装饰器,它为 ItemReader 添加了一个 peek 方法。这个 peek 方法允许用户提前查看一个项目。对 peek 的重复调用将返回相同的项目,并且这是从 read 方法返回的下一个项目。Spring Batch 提供了 SingleItemPeekableItemReaderBuilder 来构建 SingleItemPeekableItemReader 的实例。

备注

SingleItemPeekableItemReaderpeek 方法不是线程安全的,因为在多个线程中无法保证 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();
}
java

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 中 CrudRepositoryItemWriter 包装器。Spring Batch 提供了 RepositoryItemWriterBuilder 用于构建 RepositoryItemWriter 的实例。

JdbcBatchItemWriter

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

JpaItemWriter

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

专用读取器

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

LdifReader

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

MappingLdifReader

MappingLdifReaderResource 中读取 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 的实例。