项目读取器和写入器实现

在本节中,我们将介绍您之前部分中尚未讨论的读取器和写入器。

装饰器

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

Spring Batch 包含以下装饰器

同步项读取器

当使用一个非线程安全的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();
}

单项可窥视项读取器

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

SingleItemPeekableItemReader 的窥视方法不是线程安全的,因为它不可能在多个线程中遵守窥视。只有其中一个窥视的线程会在下一次调用 read 时获得该项目。

同步项写入器

当使用一个非线程安全的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包装一个ResourceAwareItemWriterItemStream,并在当前资源中写入的项目数量超过itemCountLimitPerResource时创建一个新的输出资源。Spring Batch 提供了MultiResourceItemWriterBuilder来构建MultiResourceItemWriter的实例。

分类组合项写入器

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

分类组合项处理器

ClassifierCompositeItemProcessor是一个ItemProcessor,它根据提供的Classifier实现的路由模式,调用一个ItemProcessor实现的集合。Spring Batch 提供了ClassifierCompositeItemProcessorBuilder来构建ClassifierCompositeItemProcessor的实例。

消息读取器和写入器

Spring Batch 为常用的消息系统提供以下读取器和写入器

AmqpItemReader

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

AmqpItemWriter

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

HibernateCursorItemReader

HibernateCursorItemReader 是一个 ItemStreamReader,用于读取基于 Hibernate 构建的数据库记录。它执行 HQL 查询,然后在初始化时,在调用 read() 方法时遍历结果集,依次返回与当前行对应的对象。Spring Batch 提供了一个 HibernateCursorItemReaderBuilder 来构建 HibernateCursorItemReader 的实例。

HibernatePagingItemReader

HibernatePagingItemReader 是一个 ItemReader,用于读取基于 Hibernate 构建的数据库记录,并且一次只读取固定数量的项目。Spring Batch 提供了一个 HibernatePagingItemReaderBuilder 来构建 HibernatePagingItemReader 的实例。

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

HibernateItemWriter

HibernateItemWriter 是一个 ItemWriter,它使用 Hibernate 会话来保存或更新不属于当前 Hibernate 会话的实体。Spring Batch 提供了一个 HibernateItemWriterBuilder 来构建 HibernateItemWriter 的实例。

JdbcBatchItemWriter

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

JpaItemWriter

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

专用读取器

Spring Batch 提供以下专用读取器

LdifReader

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

MappingLdifReader

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

AvroItemReader

AvroItemReader 从 Resource 中读取序列化后的 Avro 数据。每次读取都返回由 Java 类或 Avro 模式指定的类型的实例。读取器可以可选地配置为输入是否嵌入 Avro 模式。Spring Batch 提供了一个 AvroItemReaderBuilder 来构建 AvroItemReader 的实例。

专用写入器

Spring Batch 提供以下专用写入器

SimpleMailMessageItemWriter

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

AvroItemWriter

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

专用处理器

Spring Batch 提供以下专用处理器

ScriptItemProcessor

ScriptItemProcessor 是一个 ItemProcessor,它将当前要处理的项目传递给提供的脚本,并返回脚本的结果。Spring Batch 提供了一个 ScriptItemProcessorBuilder 来构建 ScriptItemProcessor 的实例。