SpringBatchで定期実行する方法

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式を利用することで、柔軟に実行タイミングを設定できます。