Item Reader 和 Writer 實現

在本節中,我們將介紹前面章節尚未討論過的 reader 和 writer。

裝飾器

在某些情況下,使用者需要為預先存在的 ItemReader 追加特定的行為。Spring Batch 提供了一些開箱即用的裝飾器,可以為你的 ItemReaderItemWriter 實現新增額外行為。

Spring Batch 包含以下裝飾器

SynchronizedItemStreamReader

當使用非執行緒安全的 ItemReader 時,Spring Batch 提供了 SynchronizedItemStreamReader 裝飾器,可用於使 ItemReader 執行緒安全。Spring Batch 提供了 SynchronizedItemStreamReaderBuilder 來構建 SynchronizedItemStreamReader 的例項。

例如,FlatFileItemReader 不是執行緒安全的,不能用於多執行緒 Step。可以透過 SynchronizedItemStreamReader 裝飾此 reader,以便在多執行緒 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 方法。此 peek 方法允許使用者提前檢視一個 item。重複呼叫 peek 會返回相同的 item,並且這是從 read 方法返回的下一個 item。Spring Batch 提供了 SingleItemPeekableItemReaderBuilder 來構建 SingleItemPeekableItemReader 的例項。

SingleItemPeekableItemReader 的 peek 方法不是執行緒安全的,因為在多個執行緒中無法保證 peek 的結果。只有其中一個 peek 過的執行緒會在下一次呼叫 read 時獲取到該 item。

SynchronizedItemStreamWriter

當使用非執行緒安全的 ItemWriter 時,Spring Batch 提供了 SynchronizedItemStreamWriter 裝飾器,可用於使 ItemWriter 執行緒安全。Spring Batch 提供了 SynchronizedItemStreamWriterBuilder 來構建 SynchronizedItemStreamWriter 的例項。

例如,FlatFileItemWriter 不是執行緒安全的,不能用於多執行緒 Step。可以透過 SynchronizedItemStreamWriter 裝飾此 writer,以便在多執行緒 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 實現中的一個。如果所有委託物件都是執行緒安全的,則此實現是執行緒安全的。Spring Batch 提供了 ClassifierCompositeItemWriterBuilder 來構建 ClassifierCompositeItemWriter 的例項。

ClassifierCompositeItemProcessor

ClassifierCompositeItemProcessor 是一個 ItemProcessor,它根據提供的 Classifier 實現的路由模式,呼叫一組 ItemProcessor 實現中的一個。Spring Batch 提供了 ClassifierCompositeItemProcessorBuilder 來構建 ClassifierCompositeItemProcessor 的例項。

訊息系統 Reader 和 Writer

Spring Batch 為常用的訊息系統提供了以下 reader 和 writer

AmqpItemReader

AmqpItemReader 是一個 ItemReader,它使用 AmqpTemplate 從 exchange 接收或轉換訊息。Spring Batch 提供了 AmqpItemReaderBuilder 來構建 AmqpItemReader 的例項。

AmqpItemWriter

AmqpItemWriter 是一個 ItemWriter,它使用 AmqpTemplate 將訊息傳送到 AMQP exchange。如果在提供的 AmqpTemplate 中未指定名稱,訊息將傳送到無名 exchange。Spring Batch 提供了 AmqpItemWriterBuilder 來構建 AmqpItemWriter 的例項。

JmsItemReader

JmsItemReader 是一個用於 JMS 的 ItemReader,它使用 JmsTemplate。該 template 應有一個預設目的地,用於為 read() 方法提供 item。Spring Batch 提供了 JmsItemReaderBuilder 來構建 JmsItemReader 的例項。

JmsItemWriter

JmsItemWriter 是一個用於 JMS 的 ItemWriter,它使用 JmsTemplate。該 template 應有一個預設目的地,用於在 write(List) 中傳送 item。Spring Batch 提供了 JmsItemWriterBuilder 來構建 JmsItemWriter 的例項。

KafkaItemReader

KafkaItemReader 是一個用於 Apache Kafka topic 的 ItemReader。它可以配置為從同一 topic 的多個分割槽讀取訊息。它在執行上下文中儲存訊息偏移量以支援重啟功能。Spring Batch 提供了 KafkaItemReaderBuilder 來構建 KafkaItemReader 的例項。

KafkaItemWriter

KafkaItemWriter 是一個用於 Apache Kafka 的 ItemWriter,它使用 KafkaTemplate 將事件傳送到預設 topic。Spring Batch 提供了 KafkaItemWriterBuilder 來構建 KafkaItemWriter 的例項。

資料庫 Reader

Spring Batch 提供了以下資料庫 reader

Neo4jItemReader

Neo4jItemReader 是一個 ItemReader,它使用分頁技術從圖資料庫 Neo4j 中讀取物件。Spring Batch 提供了 Neo4jItemReaderBuilder 來構建 Neo4jItemReader 的例項。

MongoItemReader

MongoItemReader 是一個 ItemReader,它使用分頁技術從 MongoDB 中讀取文件。Spring Batch 提供了 MongoItemReaderBuilder 來構建 MongoItemReader 的例項。

RepositoryItemReader

RepositoryItemReader 是一個 ItemReader,它使用 PagingAndSortingRepository 讀取記錄。Spring Batch 提供了 RepositoryItemReaderBuilder 來構建 RepositoryItemReader 的例項。

資料庫 Writer

Spring Batch 提供了以下資料庫 writer

Neo4jItemWriter

Neo4jItemWriter 是一個 ItemWriter 實現,它向 Neo4j 資料庫寫入資料。Spring Batch 提供了 Neo4jItemWriterBuilder 來構建 Neo4jItemWriter 的例項。

MongoItemWriter

MongoItemWriter 是一個 ItemWriter 實現,它使用 Spring Data 的 MongoOperations 實現向 MongoDB 儲存寫入資料。Spring Batch 提供了 MongoItemWriterBuilder 來構建 MongoItemWriter 的例項。

RepositoryItemWriter

RepositoryItemWriter 是 Spring Data 中 CrudRepository 的一個 ItemWriter 包裝器。Spring Batch 提供了 RepositoryItemWriterBuilder 來構建 RepositoryItemWriter 的例項。

JdbcBatchItemWriter

JdbcBatchItemWriter 是一個 ItemWriter,它使用 NamedParameterJdbcTemplate 的批次處理功能,為所有提供的 item 執行批次語句。Spring Batch 提供了 JdbcBatchItemWriterBuilder 來構建 JdbcBatchItemWriter 的例項。

JpaItemWriter

JpaItemWriter 是一個 ItemWriter,它使用 JPA EntityManagerFactory 合併所有不屬於持久化上下文的實體。Spring Batch 提供了 JpaItemWriterBuilder 來構建 JpaItemWriter 的例項。

特殊 Reader

Spring Batch 提供了以下特殊 reader

LdifReader

LdifReaderResource 讀取 LDIF (LDAP 資料交換格式) 記錄,解析它們,併為每次執行的 read 返回一個 LdapAttribute 物件。Spring Batch 提供了 LdifReaderBuilder 來構建 LdifReader 的例項。

MappingLdifReader

MappingLdifReaderResource 讀取 LDIF (LDAP 資料交換格式) 記錄,解析它們,然後將每個 LDIF 記錄對映到一個 POJO(普通舊 Java 物件)。每次 read 返回一個 POJO。Spring Batch 提供了 MappingLdifReaderBuilder 來構建 MappingLdifReader 的例項。

AvroItemReader

AvroItemReader 從 Resource 讀取序列化的 Avro 資料。每次 read 返回由 Java 類或 Avro Schema 指定的型別的例項。可以配置 reader 以選擇是否在輸入中嵌入 Avro schema。Spring Batch 提供了 AvroItemReaderBuilder 來構建 AvroItemReader 的例項。

特殊 Writer

Spring Batch 提供了以下特殊 writer

SimpleMailMessageItemWriter

SimpleMailMessageItemWriter 是一個可以傳送郵件訊息的 ItemWriter。它將實際傳送訊息的任務委託給 MailSender 的例項。Spring Batch 提供了 SimpleMailMessageItemWriterBuilder 來構建 SimpleMailMessageItemWriter 的例項。

AvroItemWriter

AvroItemWrite 根據給定的型別或 Schema 將 Java 物件序列化到 WriteableResource。可以配置 writer 以選擇是否在輸出中嵌入 Avro schema。Spring Batch 提供了 AvroItemWriterBuilder 來構建 AvroItemWriter 的例項。

特殊 Processor

Spring Batch 提供了以下特殊 processor

ScriptItemProcessor

ScriptItemProcessor 是一個 ItemProcessor,它將當前要處理的 item 傳遞給提供的指令碼,並由 processor 返回指令碼的執行結果。Spring Batch 提供了 ScriptItemProcessorBuilder 來構建 ScriptItemProcessor 的例項。