SpringBatchの基本的な書き方

SpringBatchの基本的な書き方

Spring Batchは、大量データのバッチ処理を効率的に実行するためのフレームワークです。
以下では、基本的なSpring Batchの構成要素とその書き方について解説します。

1. Spring Batchの基本構成

Spring Batchは主に以下の3つの要素で構成されています:

  • Job:

バッチ処理全体を定義する単位です。
1つのJobは複数のStepで構成されます。

  • Step:

Jobを構成する処理の単位です。
1つのStepは、ItemReader、ItemProcessor、ItemWriterという3つのコンポーネントで構成されます。

  • ItemReader/ItemProcessor/ItemWriter:

バッチ処理の各ステップで使用される基本コンポーネントです。
ItemReaderがデータを読み込み、ItemProcessorで処理を行い、ItemWriterでデータを書き出します。

2. Spring Batchのプロジェクト設定

SpringBootを使ってSpring Batchプロジェクトを始めるには、spring-boot-starter-batch依存関係を追加します。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

3. JobとStepの定義

以下に、簡単なバッチジョブの定義例を示します。

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

  private final JobBuilderFactory jobBuilderFactory;
  private final StepBuilderFactory stepBuilderFactory;

  public BatchConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
    this.jobBuilderFactory = jobBuilderFactory;
    this.stepBuilderFactory = stepBuilderFactory;
  }

  @Bean
  public Job exampleJob() {
    return jobBuilderFactory.get("exampleJob")
        .incrementer(new RunIdIncrementer())
        .start(exampleStep())
        .build();
  }

  @Bean
  public Step exampleStep() {
    return stepBuilderFactory.get("exampleStep")
        .<String, String>chunk(10)
        .reader(exampleReader())
        .processor(exampleProcessor())
        .writer(exampleWriter())
        .build();
  }

  @Bean
  public ItemReader<String> exampleReader() {
    return new ListItemReader<>(Arrays.asList("item1", "item2", "item3"));
  }

  @Bean
  public ItemProcessor<String, String> exampleProcessor() {
    return item -> "processed " + item;
  }

  @Bean
  public ItemWriter<String> exampleWriter() {
    return items -> items.forEach(System.out::println);
  }
}

4. Jobの実行

SpringBootでは、SpringApplication.run()メソッドによってアプリケーションを起動するだけで、自動的に定義されたバッチジョブが実行されます。
ジョブは通常、SpringBootのCommandLineRunnerまたはApplicationRunnerインターフェースを使って実行されます。

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParametersBuilder;

@SpringBootApplication
public class BatchApplication implements CommandLineRunner {

  private final JobLauncher jobLauncher;
  private final Job exampleJob;

  public BatchApplication(JobLauncher jobLauncher, Job exampleJob) {
    this.jobLauncher = jobLauncher;
    this.exampleJob = exampleJob;
  }

  public static void main(String[] args) {
    SpringApplication.run(BatchApplication.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    jobLauncher.run(exampleJob, new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters());
  }
}

5. 読み込み、処理、書き込みのカスタマイズ

  • ItemReader:

データの読み込みをカスタマイズするために、例えば、JDBCやJPA、ファイルなどからデータを読み込むことができます。
以下はJDBCを使ったItemReaderの例です。

@Bean
public JdbcCursorItemReader<User> reader(DataSource dataSource) {
  return new JdbcCursorItemReaderBuilder<User>()
      .dataSource(dataSource)
      .name("userReader")
      .sql("SELECT id, name FROM users")
      .rowMapper(new BeanPropertyRowMapper<>(User.class))
      .build();
}
  • ItemProcessor:

データの処理をカスタマイズするために、任意のビジネスロジックを追加できます。

@Bean
public ItemProcessor<User, User> processor() {
  return user -> {
    user.setName(user.getName().toUpperCase());
    return user;
  };
}
  • ItemWriter:

データの書き込みをカスタマイズするために、データベース、ファイル、外部サービスなどにデータを出力できます。

@Bean
public JdbcBatchItemWriter<User> writer(DataSource dataSource) {
  return new JdbcBatchItemWriterBuilder<User>()
      .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
      .sql("INSERT INTO users (id, name) VALUES (:id, :name)")
      .dataSource(dataSource)
      .build();
}

6. エラーハンドリングと再試行

Spring Batchでは、StepやChunkのエラーハンドリングや再試行機能を簡単に設定できます。

@Bean
public Step exampleStep() {
  return stepBuilderFactory.get("exampleStep")
      .<String, String>chunk(10)
      .reader(exampleReader())
      .processor(exampleProcessor())
      .writer(exampleWriter())
      .faultTolerant()
      .retryLimit(3)
      .retry(Exception.class)
      .skipLimit(5)
      .skip(Exception.class)
      .build();
}

まとめ

Spring Batchは大規模なデータ処理を効率的に行うための強力なツールです。
このフレームワークを利用することで、バッチ処理の定義、実行、エラーハンドリングなどを柔軟に設定できます。
特に、ItemReader、ItemProcessor、ItemWriterを組み合わせて、さまざまなバッチ処理のニーズに対応できます。
Spring Batchの実装にあたっては、アプリケーションの特性に応じたカスタマイズが重要です。