当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

ItemReader 和 ItemWriter 实现

本节介绍前面各节尚未展开说明的 reader 和 writer 实现。

装饰器

在某些场景下,你可能需要为现有的 ItemReaderItemWriter 增加特定行为。为此,Spring Batch 提供了以下开箱即用的装饰器:

SynchronizedItemStreamReader

当使用的 ItemReader 不是线程安全时,Spring Batch 提供了 SynchronizedItemStreamReader 装饰器,可用来让该 ItemReader 具备线程安全能力。Spring Batch 还提供了 SynchronizedItemStreamReaderBuilder 用于构造 SynchronizedItemStreamReader 实例。

例如,FlatFileItemReader 不是线程安全的,不能直接用于多线程 step。可以通过 SynchronizedItemStreamReader 对它进行装饰,从而安全地在多线程 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 方法。通过这个方法,用户可以预览下一个将要读取的 item。多次调用 peek 会返回同一个 item,而该 item 也会在下一次调用 read 时被真正返回。Spring Batch 还提供了 SingleItemPeekableItemReaderBuilder,用于构造 SingleItemPeekableItemReader 实例。

SingleItemPeekableItemReader 的 peek 方法不是线程安全的,因为在多线程环境下无法保证每个线程都能正确兑现预览结果。多个线程中,最终只有一个线程会在下一次调用 read 时拿到该 item。

SynchronizedItemStreamWriter

当使用的 ItemWriter 不是线程安全时,Spring Batch 提供了 SynchronizedItemStreamWriter 装饰器,可用来让该 ItemWriter 具备线程安全能力。Spring Batch 还提供了 SynchronizedItemStreamWriterBuilder 用于构造 SynchronizedItemStreamWriter 实例。

例如,FlatFileItemWriter 不是线程安全的,不能直接用于多线程 step。可以通过 SynchronizedItemStreamWriter 对它进行装饰,从而安全地在多线程 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

MultiResourceItemWriterResourceAwareItemWriterItemStream 进行包装,当当前资源中已写入的 item 数量超过 itemCountLimitPerResource 时,会自动创建新的输出资源。Spring Batch 提供了 MultiResourceItemWriterBuilder 用于构造 MultiResourceItemWriter 实例。

ClassifierCompositeItemWriter

ClassifierCompositeItemWriter 基于提供的 Classifier 所实现的路由模式,为每个 item 从一组 ItemWriter 实现中选择一个进行调用。如果所有委托 writer 都是线程安全的,那么该实现本身也是线程安全的。Spring Batch 提供了 ClassifierCompositeItemWriterBuilder 用于构造 ClassifierCompositeItemWriter 实例。

ClassifierCompositeItemProcessor

ClassifierCompositeItemProcessor 是一种 ItemProcessor,它会基于提供的 Classifier 所实现的路由模式,从一组 ItemProcessor 实现中选择一个来处理当前 item。Spring Batch 提供了 ClassifierCompositeItemProcessorBuilder 用于构造 ClassifierCompositeItemProcessor 实例。

MappingItemWriter

MappingItemWriter 通过在写出前对每个 item 应用映射函数,把一个接收某种类型 item 的 ItemWriter 适配成接收另一种类型 item 的 writer。只要下游 item writer 是线程安全的,它就同样具备线程安全性;如果下游 writer 实现了 ItemStream,状态管理语义也会被正确保留。

这个 item writer 在与 CompositeItemWriter 组合使用时最有价值。此时,下游 writer 前面的映射函数既可以只是输入 item 的某个 getter,也可以是更复杂的转换逻辑,从而实现一种拆解式写出模式。

消息系统 Readers 与 Writers

Spring Batch 为常见消息系统提供了以下 reader 和 writer:

AmqpItemReader

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

AmqpItemWriter

AmqpItemWriter 是一个使用 AmqpTemplate 向 AMQP exchange 发送消息的 ItemWriter。如果提供的 AmqpTemplate 中未指定 exchange 名称,消息将发送到无名 exchange。Spring Batch 提供了 AmqpItemWriterBuilder 用于构造 AmqpItemWriter 实例。

JmsItemReader

JmsItemReader 是一个面向 JMS 的 ItemReader,底层使用 JmsTemplate。该模板应配置默认目的地,以便为 read() 方法提供要读取的 item。Spring Batch 提供了 JmsItemReaderBuilder 用于构造 JmsItemReader 实例。

JmsItemWriter

JmsItemWriter 是一个面向 JMS 的 ItemWriter,底层使用 JmsTemplate。该模板应配置默认目的地,write(List) 中的 item 会发送到该目的地。Spring Batch 提供了 JmsItemWriterBuilder 用于构造 JmsItemWriter 实例。

KafkaItemReader

KafkaItemReader 是一个面向 Apache Kafka topic 的 ItemReader。它可以配置为从同一 topic 的多个分区读取消息,并会把消息 offset 保存到执行上下文中,以支持重启能力。Spring Batch 提供了 KafkaItemReaderBuilder 用于构造 KafkaItemReader 实例。

KafkaItemWriter

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

数据库 Readers

Spring Batch 提供了以下数据库 reader:

MongoPagingItemReader

MongoPagingItemReader 是一个通过分页方式从 MongoDB 读取文档的 ItemReader。Spring Batch 提供了 MongoPagingItemReaderBuilder 用于构造 MongoPagingItemReader 实例。

MongoCursorItemReader

MongoCursorItemReader 是一个通过流式方式从 MongoDB 读取文档的 ItemReader。Spring Batch 提供了 MongoCursorItemReaderBuilder 用于构造 MongoCursorItemReader 实例。

RepositoryItemReader

RepositoryItemReader 是一个使用 PagingAndSortingRepository 读取记录的 ItemReader。Spring Batch 提供了 RepositoryItemReaderBuilder 用于构造 RepositoryItemReader 实例。

数据库 Writers

Spring Batch 提供了以下数据库 writer:

MongoItemWriter

MongoItemWriter 是一个基于 Spring Data MongoOperations 实现、向 MongoDB 存储写入数据的 ItemWriter。Spring Batch 提供了 MongoItemWriterBuilder 用于构造 MongoItemWriter 实例。

RepositoryItemWriter

RepositoryItemWriter 是一个针对 Spring Data CrudRepositoryItemWriter 包装器。Spring Batch 提供了 RepositoryItemWriterBuilder 用于构造 RepositoryItemWriter 实例。

JdbcBatchItemWriter

JdbcBatchItemWriter 是一个使用 NamedParameterJdbcTemplate 批处理能力,对传入的全部 item 执行批量语句的 ItemWriter。Spring Batch 提供了 JdbcBatchItemWriterBuilder 用于构造 JdbcBatchItemWriter 实例。

JpaItemWriter

JpaItemWriter 是一个使用 JPA EntityManagerFactory 合并那些尚未纳入持久化上下文实体的 ItemWriter。Spring Batch 提供了 JpaItemWriterBuilder 用于构造 JpaItemWriter 实例。

专用 Readers

Spring Batch 提供了以下专用 reader:

LdifReader

LdifReaderResource 中读取 LDIF(LDAP Data Interchange Format)记录,对其进行解析,并在每次执行 read 时返回一个 LdapAttribute 对象。Spring Batch 提供了 LdifReaderBuilder 用于构造 LdifReader 实例。

MappingLdifReader

MappingLdifReaderResource 中读取 LDIF(LDAP Data Interchange Format)记录,解析后再把每条 LDIF 记录映射为一个 POJO(Plain Old Java Object)。每次读取都会返回一个 POJO。Spring Batch 提供了 MappingLdifReaderBuilder 用于构造 MappingLdifReader 实例。

AvroItemReader

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

专用 Writers

Spring Batch 提供了以下专用 writer:

SimpleMailMessageItemWriter

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

AvroItemWriter

AvroItemWrite 会根据给定的类型或 Schema,将 Java 对象序列化到 WriteableResource 中。该 writer 可以按需配置为在输出中嵌入 Avro schema,或者不嵌入。Spring Batch 提供了 AvroItemWriterBuilder 用于构造 AvroItemWriter 实例。

专用 Processors

Spring Batch 提供了以下专用 processor:

ScriptItemProcessor

ScriptItemProcessor 是一个 ItemProcessor,它会将当前待处理 item 传递给提供的脚本执行,并把脚本执行结果作为 processor 的返回值。Spring Batch 提供了 ScriptItemProcessorBuilder 用于构造 ScriptItemProcessor 实例。