Item Reader 和 Writer 實作
在本節中,我們將向您介紹先前章節中尚未討論的 readers 和 writers。
裝飾器
在某些情況下,使用者需要將特定的行為附加到預先存在的 ItemReader
。Spring Batch 提供了一些現成的裝飾器,可以為您的 ItemReader
和 ItemWriter
實作新增額外的行為。
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
的實例。
訊息傳遞 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
的實例。
資料庫 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
的實例。
資料庫 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 中 CrudRepository
的 ItemWriter
包裝器。Spring Batch 提供了 RepositoryItemWriterBuilder
來建構 RepositoryItemWriter
的實例。
HibernateItemWriter
HibernateItemWriter
是一個 ItemWriter
,它使用 Hibernate 會話來儲存或更新不屬於目前 Hibernate 會話的實體。Spring Batch 提供了 HibernateItemWriterBuilder
來建構 HibernateItemWriter
的實例。
特殊 Readers
Spring Batch 提供下列特殊 readers
LdifReader
LdifReader
從 Resource
讀取 LDIF (LDAP 資料交換格式) 記錄,剖析它們,並為每次執行的 read
傳回 LdapAttribute
物件。Spring Batch 提供了 LdifReaderBuilder
來建構 LdifReader
的實例。