Item Reader 和 Writer 实现

在本节中,我们将向读者介绍之前各节尚未讨论过的读取器和写入器。spring-doc.cadn.net.cn

装饰器

在某些情况下,您可能需要将专用行为附加到现有的 ItemReaderItemWriter 实现中。 为此,Spring Batch 提供了以下开箱即用的装饰器:spring-doc.cadn.net.cn

SynchronizedItemStreamReader

当使用一个非线程安全的ItemReader时,Spring Batch 提供了SynchronizedItemStreamReader装饰器,可用于使ItemReader变为线程安全。Spring Batch 提供了一个SynchronizedItemStreamReaderBuilder来构建SynchronizedItemStreamReader的实例。spring-doc.cadn.net.cn

例如,FlatFileItemReader 不是线程安全的,不能在多线程步骤中使用。可以通过使用 SynchronizedItemStreamReader 对此读取器进行装饰,以便在多线程步骤中安全地使用它。以下是如何装饰此类读取器的示例:spring-doc.cadn.net.cn

@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 的实例。spring-doc.cadn.net.cn

SingleItemPeekableItemReader 的 peek 方法不是线程安全的,因为无法在多个线程中保证 peek 操作的有效性。只有其中一个执行了 peek 的线程会在下一次调用 read 时获取到该项。

SynchronizedItemStreamWriter

当使用一个非线程安全的ItemWriter时,Spring Batch 提供了SynchronizedItemStreamWriter装饰器,可用于使ItemWriter变为线程安全。Spring Batch 提供了一个SynchronizedItemStreamWriterBuilder来构建SynchronizedItemStreamWriter的实例。spring-doc.cadn.net.cn

例如,FlatFileItemWriter 不是线程安全的,不能在多线程步骤中使用。此写入器可以使用 SynchronizedItemStreamWriter 进行装饰,以便在多线程步骤中安全地使用。以下是如何装饰此类写入器的示例:spring-doc.cadn.net.cn

@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 的实例。spring-doc.cadn.net.cn

ClassifierCompositeItemWriter

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

ClassifierCompositeItemProcessor

ClassifierCompositeItemProcessor 是一个 ItemProcessor,它根据通过提供的 Classifier 实现的路由模式,调用一组 ItemProcessor 实现中的一个。Spring Batch 提供了一个 ClassifierCompositeItemProcessorBuilder 用于构建 ClassifierCompositeItemProcessor 的实例。spring-doc.cadn.net.cn

MappingItemWriter

MappingItemWriter 通过一个映射函数,将接受给定类型项的 ItemWriter 适配为接受另一种类型项的处理器,该映射函数会在写入前应用于每一项。只要下游的项写入器是线程安全的,并且使用下游的 ItemStream 项写入器来维护状态,就能保证线程安全。spring-doc.cadn.net.cn

此 item writer 在与 CompositeItemWriter 结合使用时最为有用,其中下游 writer 前方的映射函数可以是输入项的 getter 方法,也可以是更复杂的转换逻辑,从而有效支持解构模式。spring-doc.cadn.net.cn

消息读取器和写入器

Spring Batch 为常用的消息系统提供了以下读取器和写入器:spring-doc.cadn.net.cn

AmqpItemReader

AmqpItemReader 是一个 ItemReader,它使用 AmqpTemplate 从交换机接收或转换消息。Spring Batch 提供了一个 AmqpItemReaderBuilder 来构建 AmqpItemReader 的实例。spring-doc.cadn.net.cn

AmqpItemWriter

AmqpItemWriter 是一个 ItemWriter,它使用 AmqpTemplate 将消息发送到 AMQP 交换器。如果在提供的 AmqpTemplate 中未指定名称,消息将被发送到无名交换器。Spring Batch 提供了一个 AmqpItemWriterBuilder 用于构建 AmqpItemWriter 的实例。spring-doc.cadn.net.cn

JmsItemReader

JmsItemReader 是一个用于使用 JmsTemplate 的 JMS 的 ItemReader。该模板应有一个默认目的地,用于为 read() 方法提供条目。Spring Batch 提供了一个 JmsItemReaderBuilder 来构建 JmsItemReader 的实例。spring-doc.cadn.net.cn

JmsItemWriter

JmsItemWriter 是一个用于使用 JmsTemplate 的 JMS 的 ItemWriter。该模板应有一个默认目的地,用于在 write(List) 中发送消息。Spring Batch 提供了一个 JmsItemWriterBuilder 来构建 JmsItemWriter 的实例。spring-doc.cadn.net.cn

KafkaItemReader

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

KafkaItemWriter

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

数据库读取器

Spring Batch 提供以下数据库读取器:spring-doc.cadn.net.cn

MongoPagingItemReader

MongoPagingItemReader 是一个 ItemReader,它使用分页技术从 MongoDB 读取文档。Spring Batch 提供了一个 MongoPagingItemReaderBuilder 用于构建 MongoPagingItemReader 的实例。spring-doc.cadn.net.cn

MongoCursorItemReader

MongoCursorItemReader 是一个 ItemReader,它使用流式技术从 MongoDB 读取文档。Spring Batch 提供了一个 MongoCursorItemReaderBuilder 用于构建 MongoCursorItemReader 的实例。spring-doc.cadn.net.cn

RepositoryItemReader

RepositoryItemReader 是一个 ItemReader,它使用 PagingAndSortingRepository 读取记录。Spring Batch 提供了一个 RepositoryItemReaderBuilder 来构建 RepositoryItemReader 的实例。spring-doc.cadn.net.cn

数据库写入器

Spring Batch 提供以下数据库写入器:spring-doc.cadn.net.cn

MongoItemWriter

MongoItemWriter 是一个 ItemWriter 实现,它使用 Spring Data 的 MongoOperations 实现将数据写入 MongoDB 存储。Spring Batch 提供了一个 MongoItemWriterBuilder 用于构建 MongoItemWriter 的实例。spring-doc.cadn.net.cn

RepositoryItemWriter

RepositoryItemWriter 是 Spring Data 中 CrudRepositoryItemWriter 包装器。Spring Batch 提供了一个 RepositoryItemWriterBuilder 用于构建 RepositoryItemWriter 的实例。spring-doc.cadn.net.cn

JdbcBatchItemWriter

JdbcBatchItemWriter 是一个 ItemWriter,它利用来自 NamedParameterJdbcTemplate 的批处理功能,为所有提供的项目执行一批语句。 Spring Batch 提供了一个 JdbcBatchItemWriterBuilder 用于构建 JdbcBatchItemWriter 的实例。spring-doc.cadn.net.cn

JpaItemWriter

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

专业读取器

Spring Batch 提供以下专用读取器:spring-doc.cadn.net.cn

LdifReader

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

MappingLdifReader

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

AvroItemReader

AvroItemReader 从 Resource 中读取序列化的 Avro 数据。 每次读取都会返回一个由 Java 类或 Avro Schema 指定类型的实例。 可以选择性地配置该读取器,以支持嵌入或不嵌入 Avro schema 的输入。 Spring Batch 提供了一个AvroItemReaderBuilder,用于构建AvroItemReader的实例。spring-doc.cadn.net.cn

专业撰稿人

Spring Batch 提供以下专用写入器:spring-doc.cadn.net.cn

SimpleMailMessageItemWriter

SimpleMailMessageItemWriter 是一个可以发送邮件消息的 ItemWriter。它将实际的消息发送工作委托给 MailSender 的实例。Spring Batch 提供了一个 SimpleMailMessageItemWriterBuilder,用于构建 SimpleMailMessageItemWriter 的实例。spring-doc.cadn.net.cn

AvroItemWriter

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

专用处理器

Spring Batch 提供以下专用处理器:spring-doc.cadn.net.cn

ScriptItemProcessor

ScriptItemProcessor 是一个 ItemProcessor,它将当前待处理项传递给指定的脚本,并由该处理器返回脚本的执行结果。Spring Batch 提供了一个 ScriptItemProcessorBuilder,用于构建 ScriptItemProcessor 的实例。spring-doc.cadn.net.cn