Item Reader 和 Writer 實作

在本節中,我們將向您介紹先前章節中尚未討論的 readers 和 writers。

裝飾器

在某些情況下,使用者需要將特定的行為附加到預先存在的 ItemReader。Spring Batch 提供了一些現成的裝飾器,可以為您的 ItemReaderItemWriter 實作新增額外的行為。

Spring Batch 包含下列裝飾器

SynchronizedItemStreamReader

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

例如,FlatFileItemReader執行緒安全的,不能在多執行緒步驟中使用。此 reader 可以使用 SynchronizedItemStreamReader 進行裝飾,以便在多執行緒步驟中安全地使用它。以下是如何裝飾此類 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 方法讓使用者可以預先查看一個項目。重複呼叫 peek 會傳回相同的項目,而這也是從 read 方法傳回的下一個項目。Spring Batch 提供了 SingleItemPeekableItemReaderBuilder 來建構 SingleItemPeekableItemReader 的實例。

SingleItemPeekableItemReader 的 peek 方法不是執行緒安全的,因為無法在多個執行緒中兌現 peek。只有 peek 的執行緒之一會在下一次呼叫 read 時取得該項目。

SynchronizedItemStreamWriter

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

例如,FlatFileItemWriter執行緒安全的,不能在多執行緒步驟中使用。此 writer 可以使用 SynchronizedItemStreamWriter 進行裝飾,以便在多執行緒步驟中安全地使用它。以下是如何裝飾此類 writer 的範例

@Bean
public SynchronizedItemStreamWriter<Person> itemWriter() {
	FlatFileItemWriter<Person> flatFileItemWriter = new FlatFileItemWriterBuilder<Person>()
			// set writer properties
			.build();

	return new SynchronizedItemStreamWriterBuilder<Person>()
			.delegate(flatFileItemWriter)
			.build();
}

MultiResourceItemWriter

當目前資源中寫入的項目計數超過 itemCountLimitPerResource 時,MultiResourceItemWriter 會包裝 ResourceAwareItemWriterItemStream 並建立新的輸出資源。Spring Batch 提供了 MultiResourceItemWriterBuilder 來建構 MultiResourceItemWriter 的實例。

ClassifierCompositeItemWriter

ClassifierCompositeItemWriter 根據透過提供的 Classifier 實作的路由器模式,為每個項目呼叫 ItemWriter 實作的集合之一。如果所有委派都是執行緒安全的,則實作是執行緒安全的。Spring Batch 提供了 ClassifierCompositeItemWriterBuilder 來建構 ClassifierCompositeItemWriter 的實例。

ClassifierCompositeItemProcessor

ClassifierCompositeItemProcessor 是一個 ItemProcessor,它根據透過提供的 Classifier 實作的路由器模式,呼叫 ItemProcessor 實作的集合之一。Spring Batch 提供了 ClassifierCompositeItemProcessorBuilder 來建構 ClassifierCompositeItemProcessor 的實例。

訊息傳遞 Readers 和 Writers

Spring Batch 為常用的訊息傳遞系統提供下列 readers 和 writers

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

資料庫 Readers

Spring Batch 提供下列資料庫 readers

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

資料庫 Writers

Spring Batch 提供下列資料庫 writers

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

特殊 Readers

Spring Batch 提供下列特殊 readers

LdifReader

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

MappingLdifReader

MappingLdifReaderResource 讀取 LDIF (LDAP 資料交換格式) 記錄,剖析它們,然後將每個 LDIF 記錄對應到 POJO (Plain Old Java Object)。每次讀取都會傳回 POJO。Spring Batch 提供了 MappingLdifReaderBuilder 來建構 MappingLdifReader 的實例。

AvroItemReader

AvroItemReader 從 Resource 讀取序列化的 Avro 資料。每次讀取都會傳回 Java 類別或 Avro Schema 指定的型別的實例。可以選擇性地將 reader 設定為輸入是否嵌入 Avro schema。Spring Batch 提供了 AvroItemReaderBuilder 來建構 AvroItemReader 的實例。

特殊 Writers

Spring Batch 提供下列特殊 writers

SimpleMailMessageItemWriter

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

AvroItemWriter

AvroItemWrite 根據給定的型別或 Schema 將 Java 物件序列化為 WriteableResource。可以選擇性地將 writer 設定為在輸出中嵌入 Avro schema。Spring Batch 提供了 AvroItemWriterBuilder 來建構 AvroItemWriter 的實例。

特殊 Processors

Spring Batch 提供下列特殊 processors

ScriptItemProcessor

ScriptItemProcessor 是一個 ItemProcessor,它將要處理的目前項目傳遞給提供的 script,而 script 的結果由 processor 傳回。Spring Batch 提供了 ScriptItemProcessorBuilder 來建構 ScriptItemProcessor 的實例。