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の実装にあたっては、アプリケーションの特性に応じたカスタマイズが重要です。