このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Batch ドキュメント 6.0.6 を使用してください! |
アイテムリーダーおよびライターの実装
このセクションでは、前のセクションでまだ説明していないリーダーとライターを紹介します。
デコレーター
場合によっては、既存の ItemReader または ItemWriter 実装に特別な動作を追加する必要があるかもしれません。この目的のために、Spring Batch では以下のデコレータがすぐに使用できます。
SynchronizedItemStreamReader
スレッドセーフではない 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();
}SingleItemPeekableItemReader
Spring Batch には、ItemReader にピークメソッドを追加するデコレーターが含まれています。このピークメソッドにより、ユーザーは 1 つ先のアイテムをピークできます。ピークを繰り返し呼び出すと同じアイテムが返され、これが read メソッドから返される次のアイテムです。Spring Batch は、SingleItemPeekableItemReader のインスタンスを構築するために SingleItemPeekableItemReaderBuilder を提供します。
| SingleItemPeekableItemReader のピークメソッドは、複数のスレッドでピークを尊重することができないため、スレッドセーフではありません。ピークしたスレッドの 1 つだけが、次の読み取り呼び出しでそのアイテムを取得します。 |
SynchronizedItemStreamWriter
スレッドセーフではない 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
MultiResourceItemWriter は ResourceAwareItemWriterItemStream をラップし、現在のリソースに書き込まれたアイテムの数が itemCountLimitPerResource を超えると、新しい出力リソースを作成します。Spring Batch は、MultiResourceItemWriterBuilder を提供して、MultiResourceItemWriter のインスタンスを構築します。
ClassifierCompositeItemWriter
ClassifierCompositeItemWriter は、提供された Classifier によって実装されたルーターパターンに基づいて、各アイテムの ItemWriter 実装のコレクションの 1 つを呼び出します。すべてのデリゲートがスレッドセーフである場合、実装はスレッドセーフです。Spring Batch は、ClassifierCompositeItemWriterBuilder を提供して、ClassifierCompositeItemWriter のインスタンスを構築します。
ClassifierCompositeItemProcessor
ClassifierCompositeItemProcessor は、提供された Classifier を通じて実装されたルーターパターンに基づいて、ItemProcessor 実装のコレクションの 1 つを呼び出す ItemProcessor です。Spring Batch は、ClassifierCompositeItemProcessor のインスタンスを構築するために ClassifierCompositeItemProcessorBuilder を提供します。
MappingItemWriter
MappingItemWriter は、特定の型のアイテムを受け付ける ItemWriter を、書き込み前に各アイテムにマッピング関数を適用することで、別の型のアイテムを受け付ける ItemWriter に適合させます。下流のアイテムライターがスレッドセーフである限り、スレッドセーフは保証され、下流の ItemStream アイテムライターでは状態管理が尊重されます。
このアイテムライターは、CompositeItemWriter と組み合わせて使用すると最も便利です。この場合、下流のライターの前のマッピング関数は、入力アイテムの getter またはより複雑な変換ロジックにすることができ、分解パターンを効果的に許可します。
メッセージングリーダーおよびライター
Spring Batch は、一般的に使用されるメッセージングシステム用に次のリーダーとライターを提供します。
AmqpItemReader
AmqpItemReader は、AmqpTemplate を使用して交換機からメッセージを受信または変換する ItemReader です。Spring Batch は、AmqpItemReaderBuilder を提供して、AmqpItemReader のインスタンスを構築します。
AmqpItemWriter
AmqpItemWriter は、AmqpTemplate を使用して AMQP 交換にメッセージを送信する ItemWriter です。指定された AmqpTemplate で名前が指定されていない場合、メッセージは名前のない交換に送信されます。Spring Batch は、AmqpItemWriter のインスタンスを構築するために AmqpItemWriterBuilder を提供します。
JmsItemReader
JmsItemReader は、JmsTemplate を使用する JMS 用の ItemReader です。テンプレートには、read() メソッドにアイテムを提供するために使用されるデフォルトの宛先が必要です。Spring Batch は、JmsItemReader のインスタンスを構築するために JmsItemReaderBuilder を提供します。
JmsItemWriter
JmsItemWriter は、JmsTemplate を使用する JMS 用の ItemWriter です。テンプレートには、write(List) でアイテムを送信するために使用されるデフォルトの宛先が必要です。Spring Batch は、JmsItemWriter のインスタンスを構築するために JmsItemWriterBuilder を提供します。
データベースリーダー
Spring Batch は、次のデータベースリーダーを提供します。
MongoPagingItemReader
MongoPagingItemReader は、ページング技術を使用して MongoDB からドキュメントを読み取る ItemReader です。Spring Batch は、MongoPagingItemReader のインスタンスを構築する MongoPagingItemReaderBuilder を提供します。
MongoCursorItemReader
MongoCursorItemReader は、ストリーミング技術を使用して MongoDB からドキュメントを読み取る ItemReader です。Spring Batch は、MongoCursorItemReader のインスタンスを構築するための MongoCursorItemReaderBuilder を提供します。
PageableItemReader
PageableItemReader は、Spring Data Pageable にクエリ関数を適用してレコードを読み取ります。この関数は、リポジトリメソッド参照、またはカスタムリポジトリクエリを呼び出して Slice を返すラムダ式にすることができます。RepositoryItemReader とは異なり、リポジトリメソッドの選択にリフレクションは使用しません。
The reader requires a query function and a page size. A Sort can optionally be specified, in which case it is passed to the query function through the Pageable. If no Sort is specified, the results are not sorted. Spring Batch provides a PageableItemReaderBuilder to construct an instance of the PageableItemReader. For example, a repository that extends PagingAndSortingRepository can be used as follows:
PageableItemReader<Customer> reader = new PageableItemReaderBuilder<Customer>()
.pageSize(100)
.query(customerRepository::findAll)
.sort(Sort.by(Sort.Direction.ASC, "id"))
.build();Sort can reference properties either by name, as shown above, or through type-safe property references, which are validated by the compiler and are refactoring-safe:
.sort(Sort.by(Sort.Direction.ASC, Customer::getId))RepositoryItemReader
The RepositoryItemReader is an ItemReader that reads records by using a PagingAndSortingRepository. For a type-safe alternative that does not rely on reflection, see PageableItemReader。
データベースライター
Spring Batch は、次のデータベースライターを提供します。
MongoItemWriter
MongoItemWriter は、Spring Data の MongoOperations の実装を使用して MongoDB ストアに書き込む ItemWriter 実装です。Spring Batch は、MongoItemWriterBuilder を提供して、MongoItemWriter のインスタンスを構築します。
RepositoryItemWriter
RepositoryItemWriter は、Spring Data からの CrudRepository の ItemWriter ラッパーです。Spring Batch は、RepositoryItemWriterBuilder を提供して、RepositoryItemWriter のインスタンスを構築します。
デフォルトでは、ライターはチャンク全体を使用して CrudRepository#saveAll(Iterable) を呼び出します。別のメソッドは setMethodName で選択できます。指定されたメソッドが単一のアイテムを受け入れる場合、チャンク内のアイテムごとに 1 回呼び出されます。代わりに Iterable (たとえば JpaRepository#saveAllAndFlush(Iterable))を受け入れる場合は、チャンク全体を使用して 1 回呼び出されます。
If the underlying repository needs to be flushed after writing and does not expose a single method that both saves and flushes (unlike saveAllAndFlush), the flush method can be overridden in a subclass to perform the flush after the chunk has been written. The repository field is protected so that subclasses can access it directly:
public class FlushingRepositoryItemWriter<T> extends RepositoryItemWriter<T> {
public FlushingRepositoryItemWriter(JpaRepository<T, ?> repository) {
super(repository);
}
@Override
protected void flush() {
((JpaRepository<T, ?>) this.repository).flush();
}
}専門リーダー
Spring Batch は、次の専門リーダーを提供します。
LdifReader
LdifReader は、Resource から LDIF(LDAP Data Interchange Format)レコードを読み取り、解析し、実行された read ごとに LdapAttribute オブジェクトを返します。Spring Batch は、LdifReader のインスタンスを構築するために LdifReaderBuilder を提供します。
MappingLdifReader
MappingLdifReader は、Resource から LDIF(LDAP データ交換形式)レコードを読み取り、解析してから、各 LDIF レコードを POJO(Plain Old Java Object)にマップします。各読み取りは POJO を返します。Spring Batch は、MappingLdifReader のインスタンスを構築する MappingLdifReaderBuilder を提供します。
AvroItemReader
AvroItemReader は、リソースから直列化された Avro データを読み取ります。各読み取りは、Java クラスまたは Avro スキーマで指定された型のインスタンスを返します。リーダーは、Avro スキーマを埋め込むかどうかの入力用にオプションで構成できます。Spring Batch は、AvroItemReaderBuilder を提供して AvroItemReader のインスタンスを構築します。
ResourcesItemReader
The ResourcesItemReader serves up Resource items themselves, instead of their content, one Resource per read. It is typically used as the reader of a step that processes each matching resource individually (for example, an archiving or file-moving step). Spring Batch provides a ResourcesItemReaderBuilder to construct an instance of the ResourcesItemReader, which can resolve resources directly from one or more location patterns:
ResourcesItemReader reader = new ResourcesItemReaderBuilder()
.resources("file:/data/inputs/*.csv")
.name("resourcesReader")
.build(); 各パターンは PathMatchingResourcePatternResolver で解決されるため、Spring でサポートされているリソースプレフィックス (file:、classpath:、classpath*: など) に加えて、Ant スタイルのワイルドカード (、*、?) を使用できます。