シングルステップのバッチジョブスターター

ここでは、Spring Cloud Task に含まれるスタータを使用して、Step 単体で Spring Batch Job を開発する方法について説明します。このスターターを使用すると、構成を使用して ItemReaderItemWriter、または完全なシングルステップ 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 つのステップで構成できる一連のプロパティが用意されています。

表 1: ジョブのプロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.jobName

String

null

ジョブの名前。

spring.batch.job.stepName

String

null

ステップの名前。

spring.batch.job.chunkSize

Integer

null

トランザクションごとに処理されるアイテムの数。

上記のプロパティを構成すると、単一のチャンクベースのステップを持つジョブが作成されます。このチャンクベースのステップは、Map<String, Object> インスタンスを項目として読み取り、処理し、書き込みます。ただし、このステップではまだ何も行われません。何らかの処理を行うには、ItemReader、オプションの ItemProcessor、および ItemWriter を構成する必要があります。これらのいずれかを構成するには、プロパティを使用して自動構成を提供するオプションの 1 つを構成するか、標準の Spring 構成メカニズムを使用して独自のオプションを構成することができます。

独自に構成する場合は、入力型と出力型がステップ内の他の型と一致する必要があります。このスターターの ItemReader 実装と ItemWriter 実装はすべて、入力項目と出力項目として Map<String, Object> を使用します。

ItemReader 実装の自動構成

このスターターは、4 つの異なる ItemReader 実装 ( AmqpItemReaderFlatFileItemReaderJdbcCursorItemReaderKafkaItemReader) の自動構成を提供します。このセクションでは、提供された自動構成を使用してこれらのそれぞれを構成する方法の概要を説明します。

AmqpItemReader

AmqpItemReader を使用すると、AMQP でキューまたはトピックから読み取ることができます。この ItemReader 実装の自動構成は、2 つの構成セットに依存します。1 つ目は、AmqpTemplate の構成です。これを自分で設定することも、Spring Boot が提供する自動構成を使用することもできます。Spring Boot AMQP ドキュメント (英語) を参照してください。AmqpTemplate を構成したら、次のプロパティを設定することでバッチ機能を有効にしてそれをサポートできます。

表 2: AmqpItemReader プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.amqpitemreader.enabled

boolean

false

true の場合、自動構成が実行されます。

spring.batch.job.amqpitemreader.jsonConverterEnabled

boolean

true

メッセージを解析するために Jackson2JsonMessageConverter を登録する必要があるかどうかを示します。

詳しくは、AmqpItemReader ドキュメント (Javadoc) を参照してください。

FlatFileItemReader

FlatFileItemReader を使用すると、フラットファイル (CSV やその他のファイル形式など) から読み取ることができます。ファイルから読み取るには、通常の Spring 構成 (LineTokenizerRecordSeparatorPolicyFieldSetMapperLineMapper または SkippedLinesCallback) を通じていくつかのコンポーネントを自分で提供できます。次のプロパティを使用してリーダーを構成することもできます。

表 3: FlatFileItemReader プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.flatfileitemreader.saveState

boolean

true

再起動のために状態を保存するかどうかを決定します。

spring.batch.job.flatfileitemreader.name

String

null

ExecutionContext で一意のキーを提供するために使用される名前。

spring.batch.job.flatfileitemreader.maxItemcount

int

Integer.MAX_VALUE

ファイルから読み取られる項目の最大数。

spring.batch.job.flatfileitemreader.currentItemCount

int

0

すでに読まれたアイテムの数。再起動時に使用されます。

spring.batch.job.flatfileitemreader.comments

List<String>

空のリスト

ファイル内のコメント行 (無視される行) を示す文字列のリスト。

spring.batch.job.flatfileitemreader.resource

Resource

null

読み取られるリソース。

spring.batch.job.flatfileitemreader.strict

boolean

true

true に設定すると、リソースが見つからない場合、リーダーは例外をスローします。

spring.batch.job.flatfileitemreader.encoding

String

FlatFileItemReader.DEFAULT_CHARSET

ファイルを読み取るときに使用されるエンコーディング。

spring.batch.job.flatfileitemreader.linesToSkip

int

0

ファイルの先頭でスキップする行数を示します。

spring.batch.job.flatfileitemreader.delimited

boolean

false

ファイルが区切りファイル (CSV およびその他の形式) であるかどうかを示します。このプロパティまたは spring.batch.job.flatfileitemreader.fixedLength のうち 1 つだけが同時に true になることができます。

spring.batch.job.flatfileitemreader.delimiter

String

DelimitedLineTokenizer.DELIMITER_COMMA

区切り文字で区切られたファイルを読み取る場合、解析する区切り文字を示します。

spring.batch.job.flatfileitemreader.quoteCharacter

char

DelimitedLineTokenizer.DEFAULT_QUOTE_CHARACTER

値を引用符で囲むために使用される文字を決定するために使用されます。

spring.batch.job.flatfileitemreader.includedFields

List<Integer>

空のリスト

レコード内のどのフィールドをアイテムに含めるかを決定するインデックスのリスト。

spring.batch.job.flatfileitemreader.fixedLength

boolean

false

ファイルのレコードが列番号によって解析されるかどうかを示します。このプロパティまたは spring.batch.job.flatfileitemreader.delimited のうち 1 つだけが同時に true になることができます。

spring.batch.job.flatfileitemreader.ranges

List<Range>

空のリスト

固定幅レコードを解析するための列範囲のリスト。範囲に関するドキュメント (Javadoc) を参照してください。

spring.batch.job.flatfileitemreader.names

String []

null

レコードから解析された各フィールドの名前のリスト。これらの名前は、この ItemReader から返される項目の Map<String, Object> 内のキーです。

spring.batch.job.flatfileitemreader.parsingStrict

boolean

true

true に設定すると、フィールドをマップできない場合、マッピングは失敗します。

JdbcCursorItemReader

JdbcCursorItemReader は、リレーショナルデータベースに対してクエリを実行し、結果のカーソル (ResultSet) を反復処理して、結果の項目を提供します。この自動構成により、PreparedStatementSetterRowMapper、またはその両方を提供できます。次のプロパティを使用して JdbcCursorItemReader を構成することもできます。

表 4: JdbcCursorItemReader プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.jdbccursoritemreader.saveState

boolean

true

再起動のために状態を保存するかどうかを決定します。

spring.batch.job.jdbccursoritemreader.name

String

null

ExecutionContext で一意のキーを提供するために使用される名前。

spring.batch.job.jdbccursoritemreader.maxItemcount

int

Integer.MAX_VALUE

ファイルから読み取られる項目の最大数。

spring.batch.job.jdbccursoritemreader.currentItemCount

int

0

すでに読まれたアイテムの数。再起動時に使用されます。

spring.batch.job.jdbccursoritemreader.fetchSize

int

データベースシステムへの呼び出しごとに取得するレコードの数を示すドライバーへのヒント。最高のパフォーマンスを得るには、通常、チャンクサイズと一致するように設定する必要があります。

spring.batch.job.jdbccursoritemreader.maxRows

int

データベースから読み取るアイテムの最大数。

spring.batch.job.jdbccursoritemreader.queryTimeout

int

クエリがタイムアウトするまでのミリ秒数。

spring.batch.job.jdbccursoritemreader.ignoreWarnings

boolean

true

リーダーが処理時に SQL 警告を無視するかどうかを決定します。

spring.batch.job.jdbccursoritemreader.verifyCursorPosition

boolean

true

RowMapper がカーソルを進めなかったことを確認するために、各読み取り後にカーソルの位置を検証する必要があるかどうかを示します。

spring.batch.job.jdbccursoritemreader.driverSupportsAbsolute

boolean

false

ドライバーがカーソルの絶対位置をサポートするかどうかを示します。

spring.batch.job.jdbccursoritemreader.useSharedExtendedConnection

boolean

false

接続が他の処理と共有されているかどうか (つまり、トランザクションの一部であるか) を示します。

spring.batch.job.jdbccursoritemreader.sql

String

null

読み取り元の SQL クエリ。

次のプロパティを使用して、リーダー専用に JDBC DataSource を指定することもできます。JdbcCursorItemReader のプロパティ

プロパティ タイプ デフォルト値 説明

spring.batch.job.jdbccursoritemreader.datasource.enable

boolean

false

JdbcCursorItemReader DataSource を有効にするかどうかを決定します。

jdbccursoritemreader.datasource.url

String

null

データベースの JDBC URL。

jdbccursoritemreader.datasource.username

String

null

データベースのログインユーザー名。

jdbccursoritemreader.datasource.password

String

null

データベースのログインパスワード。

jdbccursoritemreader.datasource.driver-class-name

String

null

JDBC ドライバーの完全修飾名。

jdbccursoritemreader_datasource が指定されていない場合、デフォルトの DataSource が JDBCCursorItemReader によって使用されます。

KafkaItemReader

Kafka トピックからデータのパーティションを取り込むことは便利であり、まさに KafkaItemReader で実行できることです。KafkaItemReader を構成するには、2 つの構成が必要です。まず、Spring Boot の Kafka 自動構成を使用して Kafka を構成する必要があります ( "Spring Boot Kafka ドキュメント" を参照)。Spring Boot から Kafka プロパティを構成したら、次のプロパティを設定して KafkaItemReader 自体を構成できます。

表 5: KafkaItemReader プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.kafkaitemreader.name

String

null

ExecutionContext で一意のキーを提供するために使用される名前。

spring.batch.job.kafkaitemreader.topic

String

null

読み取り元のトピックの名前。

spring.batch.job.kafkaitemreader.partitions

List<Integer>

空のリスト

読み取り対象のパーティションインデックスのリスト。

spring.batch.job.kafkaitemreader.pollTimeOutInSeconds

long

30

poll() 操作のタイムアウト。

spring.batch.job.kafkaitemreader.saveState

boolean

true

再起動のために状態を保存するかどうかを決定します。

ネイティブコンパイル

シングルステップバッチ処理の利点は、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 実装 ( AmqpItemWriterFlatFileItemWriterJdbcItemWriterKafkaItemWriter) と一致する ItemWriter 実装の自動構成を提供します。このセクションでは、自動構成を使用してサポートされている ItemWriter を構成する方法について説明します。

AmqpItemWriter

RabbitMQ キューに書き込むには、2 つの設定セットが必要です。まず、AmqpTemplate が必要です。これを取得する最も簡単な方法は、Spring Boot の RabbitMQ 自動構成を使用することです。Spring Boot AMQP ドキュメント (英語) を参照してください。

AmqpTemplate を構成したら、次のプロパティを設定して AmqpItemWriter を構成できます。

表 6: AmqpItemWriter プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.amqpitemwriter.enabled

boolean

false

true の場合、自動構成が実行されます。

spring.batch.job.amqpitemwriter.jsonConverterEnabled

boolean

true

メッセージを変換するために Jackson2JsonMessageConverter を登録する必要があるかどうかを示します。

FlatFileItemWriter

ステップの出力としてファイルを書き込むには、FlatFileItemWriter を構成します。自動構成は、明示的に構成されたコンポーネント ( LineAggregatorFieldExtractorFlatFileHeaderCallbackFlatFileFooterCallback など) と、指定された次のプロパティを設定することによって構成されたコンポーネントを受け入れます。

表 7: FlatFileItemWriter プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.flatfileitemwriter.resource

Resource

null

読み取られるリソース。

spring.batch.job.flatfileitemwriter.delimited

boolean

false

出力ファイルが区切りファイルかどうかを示します。true の場合、spring.batch.job.flatfileitemwriter.formatted は false でなければなりません。

spring.batch.job.flatfileitemwriter.formatted

boolean

false

出力ファイルがフォーマットされたファイルかどうかを示します。true の場合、spring.batch.job.flatfileitemwriter.delimited は false でなければなりません。

spring.batch.job.flatfileitemwriter.format

String

null

フォーマットされたファイルの出力を生成するために使用されるフォーマット。フォーマットは String.format を使用して実行されます。

spring.batch.job.flatfileitemwriter.locale

Locale

Locale.getDefault()

ファイルの生成時に使用される Locale

spring.batch.job.flatfileitemwriter.maximumLength

int

0

レコードの最大長。0 の場合、サイズは無制限です。

spring.batch.job.flatfileitemwriter.minimumLength

int

0

最小レコード長。

spring.batch.job.flatfileitemwriter.delimiter

String

,

String は、区切り文字付きファイル内のフィールドを区切るために使用されます。

spring.batch.job.flatfileitemwriter.encoding

String

FlatFileItemReader.DEFAULT_CHARSET

ファイルを書き込むときに使用するエンコーディング。

spring.batch.job.flatfileitemwriter.forceSync

boolean

false

ファイルをフラッシュ時にディスクに強制同期する必要があるかどうかを示します。

spring.batch.job.flatfileitemwriter.names

String []

null

レコードから解析された各フィールドの名前のリスト。これらの名前は、この ItemWriter によって受信される項目の Map<String, Object> 内のキーです。

spring.batch.job.flatfileitemwriter.append

boolean

false

出力ファイルが見つかった場合にファイルを追加するかどうかを示します。

spring.batch.job.flatfileitemwriter.lineSeparator

String

FlatFileItemWriter.DEFAULT_LINE_SEPARATOR

出力ファイルの行を区切るために使用する String

spring.batch.job.flatfileitemwriter.name

String

null

ExecutionContext で一意のキーを提供するために使用される名前。

spring.batch.job.flatfileitemwriter.saveState

boolean

true

再起動のために状態を保存するかどうかを決定します。

spring.batch.job.flatfileitemwriter.shouldDeleteIfEmpty

boolean

false

true に設定すると、ジョブの完了時に空のファイル (出力はありません) が削除されます。

spring.batch.job.flatfileitemwriter.shouldDeleteIfExists

boolean

true

true に設定されており、出力ファイルがあるべき場所でファイルが見つかった場合、そのファイルはステップが開始される前に削除されます。

spring.batch.job.flatfileitemwriter.transactional

boolean

FlatFileItemWriter.DEFAULT_TRANSACTIONAL

リーダーがトランザクションキューであるかどうかを示します (失敗時に読み取られた項目がキューに返されることを示します)。

JdbcBatchItemWriter

ステップの出力をリレーショナルデータベースに書き込むために、このスターターは JdbcBatchItemWriter を自動構成する機能を提供します。自動構成では、次のプロパティを設定することで、独自の ItemPreparedStatementSetter または ItemSqlParameterSourceProvider と構成オプションを提供できます。

表 8: JdbcBatchItemWriter プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.jdbcbatchitemwriter.name

String

null

ExecutionContext で一意のキーを提供するために使用される名前。

spring.batch.job.jdbcbatchitemwriter.sql

String

null

各項目の挿入に使用される SQL。

spring.batch.job.jdbcbatchitemwriter.assertUpdates

boolean

true

すべての挿入によって少なくとも 1 つのレコードが更新されることを検証するかどうか。

次のプロパティを使用して、ライター専用に JDBC DataSource を指定することもできます。JdbcBatchItemWriter のプロパティ

プロパティ タイプ デフォルト値 説明

spring.batch.job.jdbcbatchitemwriter.datasource.enable

boolean

false

JdbcCursorItemReader DataSource を有効にするかどうかを決定します。

jdbcbatchitemwriter.datasource.url

String

null

データベースの JDBC URL。

jdbcbatchitemwriter.datasource.username

String

null

データベースのログインユーザー名。

jdbcbatchitemwriter.datasource.password

String

null

データベースのログインパスワード。

jdbcbatchitemreader.datasource.driver-class-name

String

null

JDBC ドライバーの完全修飾名。

jdbcbatchitemwriter_datasource が指定されていない場合、デフォルトの DataSource が JdbcBatchItemWriter によって使用されます。

KafkaItemWriter

ステップ出力を Kafka トピックに書き込むには、KafkaItemWriter が必要です。このスターターは、2 つの場所の機能を使用して、KafkaItemWriter の自動構成を提供します。1 つ目は、Spring Boot の Kafka 自動構成です。(Spring Boot Kafka ドキュメントを参照してください) 次に、このスターターを使用すると、ライター上で 2 つのプロパティを構成できます。

表 9: KafkaItemWriter プロパティ
プロパティ タイプ デフォルト値 説明

spring.batch.job.kafkaitemwriter.topic

String

null

書き込む先の Kafka トピック。

spring.batch.job.kafkaitemwriter.delete

boolean

false

ライターに渡される項目をすべて削除イベントとしてトピックに送信するかどうか。

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>