シングルステップのバッチジョブスターター
ここでは、Spring Cloud Task に含まれるスタータを使用して、Step
単体で Spring Batch Job
を開発する方法について説明します。このスターターを使用すると、構成を使用して ItemReader
、ItemWriter
、または完全なシングルステップ Spring Batch Job
を定義できます。Spring Batch とその機能の詳細については、"Spring Batch ドキュメント" を参照してください。
Maven のスターターを入手するには、以下をビルドに追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-single-step-batch-job</artifactId>
<version>2.3.0</version>
</dependency>
Gradle のスターターを入手するには、以下をビルドに追加します。
compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2.3.0"
ジョブの定義
スターターを使用すると、ItemReader
または ItemWriter
だけを定義したり、完全な Job
を定義したりできます。このセクションでは、Job
を構成するためにどのプロパティを定義する必要があるかを定義します。
プロパティ
まず、スターターには、ジョブの基本を 1 つのステップで構成できる一連のプロパティが用意されています。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| ジョブの名前。 |
|
|
| ステップの名前。 |
|
|
| トランザクションごとに処理されるアイテムの数。 |
上記のプロパティを構成すると、単一のチャンクベースのステップを持つジョブが作成されます。このチャンクベースのステップは、Map<String, Object>
インスタンスを項目として読み取り、処理し、書き込みます。ただし、このステップではまだ何も行われません。何らかの処理を行うには、ItemReader
、オプションの ItemProcessor
、および ItemWriter
を構成する必要があります。これらのいずれかを構成するには、プロパティを使用して自動構成を提供するオプションの 1 つを構成するか、標準の Spring 構成メカニズムを使用して独自のオプションを構成することができます。
独自に構成する場合は、入力型と出力型がステップ内の他の型と一致する必要があります。このスターターの ItemReader 実装と ItemWriter 実装はすべて、入力項目と出力項目として Map<String, Object> を使用します。 |
ItemReader 実装の自動構成
このスターターは、4 つの異なる ItemReader
実装 ( AmqpItemReader
、FlatFileItemReader
、JdbcCursorItemReader
、KafkaItemReader
) の自動構成を提供します。このセクションでは、提供された自動構成を使用してこれらのそれぞれを構成する方法の概要を説明します。
AmqpItemReader
AmqpItemReader
を使用すると、AMQP でキューまたはトピックから読み取ることができます。この ItemReader
実装の自動構成は、2 つの構成セットに依存します。1 つ目は、AmqpTemplate
の構成です。これを自分で設定することも、Spring Boot が提供する自動構成を使用することもできます。Spring Boot AMQP ドキュメント (英語) を参照してください。AmqpTemplate
を構成したら、次のプロパティを設定することでバッチ機能を有効にしてそれをサポートできます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| メッセージを解析するために |
詳しくは、AmqpItemReader
ドキュメント (Javadoc) を参照してください。
FlatFileItemReader
FlatFileItemReader
を使用すると、フラットファイル (CSV やその他のファイル形式など) から読み取ることができます。ファイルから読み取るには、通常の Spring 構成 (LineTokenizer
、RecordSeparatorPolicy
、FieldSetMapper
、LineMapper
または SkippedLinesCallback
) を通じていくつかのコンポーネントを自分で提供できます。次のプロパティを使用してリーダーを構成することもできます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
|
|
|
|
|
|
| ファイルから読み取られる項目の最大数。 |
|
| 0 | すでに読まれたアイテムの数。再起動時に使用されます。 |
|
| 空のリスト | ファイル内のコメント行 (無視される行) を示す文字列のリスト。 |
|
|
| 読み取られるリソース。 |
|
|
|
|
|
|
| ファイルを読み取るときに使用されるエンコーディング。 |
|
| 0 | ファイルの先頭でスキップする行数を示します。 |
|
|
| ファイルが区切りファイル (CSV およびその他の形式) であるかどうかを示します。このプロパティまたは |
|
|
| 区切り文字で区切られたファイルを読み取る場合、解析する区切り文字を示します。 |
|
|
| 値を引用符で囲むために使用される文字を決定するために使用されます。 |
|
| 空のリスト | レコード内のどのフィールドをアイテムに含めるかを決定するインデックスのリスト。 |
|
|
| ファイルのレコードが列番号によって解析されるかどうかを示します。このプロパティまたは |
|
| 空のリスト | 固定幅レコードを解析するための列範囲のリスト。範囲に関するドキュメント (Javadoc) を参照してください。 |
|
|
| レコードから解析された各フィールドの名前のリスト。これらの名前は、この |
|
|
|
|
FlatFileItemReader
ドキュメント (Javadoc) を参照してください。
JdbcCursorItemReader
JdbcCursorItemReader
は、リレーショナルデータベースに対してクエリを実行し、結果のカーソル (ResultSet
) を反復処理して、結果の項目を提供します。この自動構成により、PreparedStatementSetter
、RowMapper
、またはその両方を提供できます。次のプロパティを使用して JdbcCursorItemReader
を構成することもできます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
|
|
|
|
|
|
| ファイルから読み取られる項目の最大数。 |
|
| 0 | すでに読まれたアイテムの数。再起動時に使用されます。 |
|
| データベースシステムへの呼び出しごとに取得するレコードの数を示すドライバーへのヒント。最高のパフォーマンスを得るには、通常、チャンクサイズと一致するように設定する必要があります。 | |
|
| データベースから読み取るアイテムの最大数。 | |
|
| クエリがタイムアウトするまでのミリ秒数。 | |
|
|
| リーダーが処理時に SQL 警告を無視するかどうかを決定します。 |
|
|
|
|
|
|
| ドライバーがカーソルの絶対位置をサポートするかどうかを示します。 |
|
|
| 接続が他の処理と共有されているかどうか (つまり、トランザクションの一部であるか) を示します。 |
|
|
| 読み取り元の SQL クエリ。 |
次のプロパティを使用して、リーダー専用に JDBC DataSource を指定することもできます。JdbcCursorItemReader
のプロパティ
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| データベースの JDBC URL。 |
|
|
| データベースのログインユーザー名。 |
|
|
| データベースのログインパスワード。 |
|
|
| JDBC ドライバーの完全修飾名。 |
jdbccursoritemreader_datasource が指定されていない場合、デフォルトの DataSource が JDBCCursorItemReader によって使用されます。 |
JdbcCursorItemReader
ドキュメント (Javadoc) を参照してください。
KafkaItemReader
Kafka トピックからデータのパーティションを取り込むことは便利であり、まさに KafkaItemReader
で実行できることです。KafkaItemReader
を構成するには、2 つの構成が必要です。まず、Spring Boot の Kafka 自動構成を使用して Kafka を構成する必要があります ( "Spring Boot Kafka ドキュメント" を参照)。Spring Boot から Kafka プロパティを構成したら、次のプロパティを設定して KafkaItemReader
自体を構成できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| 読み取り元のトピックの名前。 |
|
| 空のリスト | 読み取り対象のパーティションインデックスのリスト。 |
|
| 30 |
|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
KafkaItemReader
ドキュメント (Javadoc) を参照してください。
ネイティブコンパイル
シングルステップバッチ処理の利点は、JVM の使用時に実行時に使用するリーダー Bean とライター Bean を動的に選択できることです。ただし、ネイティブコンパイルを使用する場合は、実行時ではなくビルド時にリーダーとライターを決定する必要があります。次の例ではこれを実行します。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
<configuration>
<jvmArguments>
-Dspring.batch.job.flatfileitemreader.name=fooReader
-Dspring.batch.job.flatfileitemwriter.name=fooWriter
</jvmArguments>
</configuration>
</execution>
</executions>
</plugin>
ItemProcessor の設定
シングルステップのバッチジョブ自動構成は、ApplicationContext
内で ItemProcessor
が使用可能な場合、それを受け入れます。正しい型 (ItemProcessor<Map<String, Object>, Map<String, Object>>
) のものが見つかると、それがステップにオートワイヤーされます。
ItemWriter 実装の自動構成
このスターターは、サポートされている ItemReader
実装 ( AmqpItemWriter
、FlatFileItemWriter
、JdbcItemWriter
、KafkaItemWriter
) と一致する ItemWriter
実装の自動構成を提供します。このセクションでは、自動構成を使用してサポートされている ItemWriter
を構成する方法について説明します。
AmqpItemWriter
RabbitMQ キューに書き込むには、2 つの設定セットが必要です。まず、AmqpTemplate
が必要です。これを取得する最も簡単な方法は、Spring Boot の RabbitMQ 自動構成を使用することです。Spring Boot AMQP ドキュメント (英語) を参照してください。
AmqpTemplate
を構成したら、次のプロパティを設定して AmqpItemWriter
を構成できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| メッセージを変換するために |
FlatFileItemWriter
ステップの出力としてファイルを書き込むには、FlatFileItemWriter
を構成します。自動構成は、明示的に構成されたコンポーネント ( LineAggregator
、FieldExtractor
、FlatFileHeaderCallback
、FlatFileFooterCallback
など) と、指定された次のプロパティを設定することによって構成されたコンポーネントを受け入れます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 読み取られるリソース。 |
|
|
| 出力ファイルが区切りファイルかどうかを示します。 |
|
|
| 出力ファイルがフォーマットされたファイルかどうかを示します。 |
|
|
| フォーマットされたファイルの出力を生成するために使用されるフォーマット。フォーマットは |
|
|
| ファイルの生成時に使用される |
|
| 0 | レコードの最大長。0 の場合、サイズは無制限です。 |
|
| 0 | 最小レコード長。 |
|
|
|
|
|
|
| ファイルを書き込むときに使用するエンコーディング。 |
|
|
| ファイルをフラッシュ時にディスクに強制同期する必要があるかどうかを示します。 |
|
|
| レコードから解析された各フィールドの名前のリスト。これらの名前は、この |
|
|
| 出力ファイルが見つかった場合にファイルを追加するかどうかを示します。 |
|
|
| 出力ファイルの行を区切るために使用する |
|
|
|
|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
|
|
|
|
|
|
|
|
|
|
| リーダーがトランザクションキューであるかどうかを示します (失敗時に読み取られた項目がキューに返されることを示します)。 |
FlatFileItemWriter
ドキュメント (Javadoc) を参照してください。
JdbcBatchItemWriter
ステップの出力をリレーショナルデータベースに書き込むために、このスターターは JdbcBatchItemWriter
を自動構成する機能を提供します。自動構成では、次のプロパティを設定することで、独自の ItemPreparedStatementSetter
または ItemSqlParameterSourceProvider
と構成オプションを提供できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| 各項目の挿入に使用される SQL。 |
|
|
| すべての挿入によって少なくとも 1 つのレコードが更新されることを検証するかどうか。 |
次のプロパティを使用して、ライター専用に JDBC DataSource を指定することもできます。JdbcBatchItemWriter
のプロパティ
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| データベースの JDBC URL。 |
|
|
| データベースのログインユーザー名。 |
|
|
| データベースのログインパスワード。 |
|
|
| JDBC ドライバーの完全修飾名。 |
jdbcbatchitemwriter_datasource が指定されていない場合、デフォルトの DataSource が JdbcBatchItemWriter によって使用されます。 |
JdbcBatchItemWriter
ドキュメント (Javadoc) を参照してください。
KafkaItemWriter
ステップ出力を Kafka トピックに書き込むには、KafkaItemWriter
が必要です。このスターターは、2 つの場所の機能を使用して、KafkaItemWriter
の自動構成を提供します。1 つ目は、Spring Boot の Kafka 自動構成です。(Spring Boot Kafka ドキュメントを参照してください) 次に、このスターターを使用すると、ライター上で 2 つのプロパティを構成できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 書き込む先の Kafka トピック。 |
|
|
| ライターに渡される項目をすべて削除イベントとしてトピックに送信するかどうか。 |
KafkaItemWriter
の構成オプションの詳細については、"KafkaItemWiter
ドキュメント (Javadoc) " を参照してください。
Spring AOT
シングルステップバッチスターターで Spring AOT を使用する場合は、コンパイル時にリーダーとライターの名前プロパティを設定する必要があります (リーダーまたはライター用の Bean を作成しない場合)。これを行うには、Boot maven プラグインまたは gradle プラグインの引数または環境変数として使用するリーダーおよびライターの名前を含める必要があります。たとえば、Maven で FlatFileItemReader
と FlatFileItemWriter
を有効にしたい場合は、次のようになります。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
<configuration>
<arguments>
<argument>--spring.batch.job.flatfileitemreader.name=foobar</argument>
<argument>--spring.batch.job.flatfileitemwriter.name=fooWriter</argument>
</arguments>
</configuration>
</plugin>