|
当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2! |
ItemReader 和 ItemWriter 实现
本节介绍前面各节尚未展开说明的 reader 和 writer 实现。
装饰器
在某些场景下,你可能需要为现有的 ItemReader 或 ItemWriter 增加特定行为。为此,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
MultiResourceItemWriter 对 ResourceAwareItemWriterItemStream 进行包装,当当前资源中已写入的 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 实例。
数据库 Readers
Spring Batch 提供了以下数据库 reader:
MongoPagingItemReader
MongoPagingItemReader 是一个通过分页方式从 MongoDB 读取文档的 ItemReader。Spring Batch 提供了 MongoPagingItemReaderBuilder 用于构造 MongoPagingItemReader 实例。
数据库 Writers
Spring Batch 提供了以下数据库 writer:
MongoItemWriter
MongoItemWriter 是一个基于 Spring Data MongoOperations 实现、向 MongoDB 存储写入数据的 ItemWriter。Spring Batch 提供了 MongoItemWriterBuilder 用于构造 MongoItemWriter 实例。
RepositoryItemWriter
RepositoryItemWriter 是一个针对 Spring Data CrudRepository 的 ItemWriter 包装器。Spring Batch 提供了 RepositoryItemWriterBuilder 用于构造 RepositoryItemWriter 实例。
专用 Readers
Spring Batch 提供了以下专用 reader:
LdifReader
LdifReader 从 Resource 中读取 LDIF(LDAP Data Interchange Format)记录,对其进行解析,并在每次执行 read 时返回一个 LdapAttribute 对象。Spring Batch 提供了 LdifReaderBuilder 用于构造 LdifReader 实例。