技術のメモ箱

Spring Batch/基本

プロジェクト設定

Spring Initializrを使うなどしてプロジェクトを準備する。
言語:Java
ビルドツール:Maven、Gradleなど。
Spring Batch:Spring Bootで利用するためのstarterライブラリ。
データベース:HyperSQL、h2など。JobRepositoryを格納するために利用する。

mainメソッド

src/main/java/com/example/batchprocessing/BatchProcessingApplication.java

@SpringBootApplication
public class BatchProcessingApplication {

    public static void main(String[] args) throws Exception {
        System.exit(SpringApplication.exit(SpringApplication.run(BatchProcessingApplication.class, args)));
    }
}

@SpringBootApplication は、下記を追加する便利なアノテーション。

exitについては Spring Bootのコア機能参照。

バッチジョブの設定

ジョブ定義、ステップ定義などを設定するには、 @Configuration クラスを作成する必要がある。

本来はJobRepositoryやJobLauncherなどのBean定義も必要だが、
クラスに@EnableBatchProcessing を付与すると、明示的に定義せずとも自動で設定してくれる。

src/main/java/com/exampe/batchprocessing/BatchConfiguration.java ※抜粋

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
    ...
}

ジョブ定義

ジョブはステップによって構築される。

@Autowired
@Bean

src/main/java/com/exampe/batchprocessing/BatchConfiguration.java ※抜粋

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }

jobBuilderFactory.get()メソッドの引数にJob名を指定する。
.flow()メソッドでこのJobで実行するStepを指定する。

ステップ定義

ステップは2種類のモデルがある。
ChunkモデルはItemReader、ItemProcessor、ItemWriterによって構築される。
Taskletモデルは自由に処理を記述できる。

src/main/java/com/exampe/batchprocessing/BatchConfiguration.java ※抜粋

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step step1(JdbcBatchItemWriter writer) {
        return stepBuilderFactory.get("step1")
                .<Person, Person> chunk(10)
                .reader(reader())
                .processor(processor())
                .writer(writer)
                .build();
    }

stepBuilderFactory.get()メソッドの引数にStep名を指定する。
.chunkや.taskletを使って、実行する処理を記載していく。
ここではchunkのため、reader、processor、writerの引数に実行する処理を指定する。

データベース

Spring Bootは、起動時にschema-@@platform@@.sqlを自動的に実行する。
-all は、すべてのプラットフォームのデフォルト。

src/main/resources/schema-all.sql

DROP TABLE people IF EXISTS;

CREATE TABLE people  (
    person_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
    first_name VARCHAR(20),
    last_name VARCHAR(20)
);
pagetop