SpringBatchで定期実行する方法
Spring Batchで定期実行を行う方法は、主にSpring BatchとSpringのスケジューリング機能を組み合わせて実現します。
以下に、Spring Batchジョブを定期的に実行するための基本的な手順を説明します。
1. Spring Batchジョブの定義
まず、Spring Batchのジョブを定義します。
これは通常、Jobインターフェースを使用して構築され、複数のStepから成り立ちます。
import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecutionListener; 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.launch.support.RunIdIncrementer; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class BatchConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Bean public Job sampleJob(Step sampleStep) { return jobBuilderFactory.get("sampleJob") .incrementer(new RunIdIncrementer()) .listener(jobExecutionListener()) .flow(sampleStep) .end() .build(); } @Bean public Step sampleStep() { return stepBuilderFactory.get("sampleStep") .tasklet((contribution, chunkContext) -> { System.out.println("This is a sample step"); return RepeatStatus.FINISHED; }) .build(); } @Bean public JobExecutionListener jobExecutionListener() { return new SampleJobExecutionListener(); } }
この例では、sampleJobという名前のジョブを定義し、その中でsampleStepというステップを実行します。
sampleStepは単純なタスクレットで、「This is a sample step」と出力します。
2. スケジューラーの設定
次に、このジョブを定期的に実行するために、Springの@EnableSchedulingアノテーションと@Scheduledアノテーションを使用します。
import org.springframework.batch.core.Job; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @Component @EnableScheduling public class JobScheduler { @Autowired private JobLauncher jobLauncher; @Autowired private Job sampleJob; @Scheduled(cron = "0 0 * * * *") // 毎時00分に実行 public void runJob() throws Exception { Map<String, JobParameter> parameters = new HashMap<>(); parameters.put("currentTime", new JobParameter(System.currentTimeMillis())); JobParameters jobParameters = new JobParameters(parameters); jobLauncher.run(sampleJob, jobParameters); } }
この例では、@Scheduledアノテーションを使用して、ジョブを定期的に実行します。
この場合、cron式を使用してジョブの実行時間を指定しています。
"0 0 * * * *"というcron式は、毎時00分にジョブを実行することを意味します。
3. SpringBootアプリケーションの実行
SpringBootを使用している場合、@SpringBootApplicationアノテーションを付けたクラスがエントリーポイントになります。
これにより、Spring Batchのジョブとスケジューリングが自動的に起動されます。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BatchApplication { public static void main(String[] args) { SpringApplication.run(BatchApplication.class, args); } }
4. cron式の説明
@Scheduledアノテーションで使用されるcron式は、ジョブの実行タイミングを細かく指定できます。
以下に、基本的なcron式のフォーマットを示します。
second minute hour day-of-month month day-of-week
- second: 秒 (0-59)
- minute: 分 (0-59)
- hour: 時間 (0-23)
- day-of-month: 日 (1-31)
- month: 月 (1-12)
- day-of-week: 曜日 (0-7) (0または7が日曜日)
たとえば、毎日午前1時にジョブを実行したい場合は、以下のように指定します。
@Scheduled(cron = "0 0 1 * * *") // 毎日午前1時に実行
まとめ
以上の手順を踏むことで、Spring Batchのジョブを定期的に実行する設定が完了します。
@Scheduledアノテーションを用いることで、簡単にスケジュールを管理できます。
また、cron式を利用することで、柔軟に実行タイミングを設定できます。