1概要

このチュートリアルでは、必要なビジネスケースについて、スケジュールされたSpring Batchジョブをトリガーしたり停止したりする


さまざまな方法を調べて比較します。

Spring Batch and Schedulerの紹介が必要な場合は、https://www.baeldung.com/introduction-to-spring-batch[Spring-Batch]およびhttps://www.baeldung.com/spring-scheduled-を参照してください。タスク[Spring-Scheduler]記事。

2.スケジュールされたSpring Batch Jobを起動する

まず、スケジューリングとバッチジョブを設定するためのクラス

SpringBatchScheduler

があります。メソッド

launchJob()

がスケジュールされたタスクとして登録されます。

さらに、スケジュール設定されたSpring Batchジョブを最も直感的な方法で起動するには、フラグがtrueに設定されている場合にのみジョブを起動するための条件付きフラグを追加します。

private AtomicBoolean enabled = new AtomicBoolean(true);

private AtomicInteger batchRunCounter = new AtomicInteger(0);

@Scheduled(fixedRate = 2000)
public void launchJob() throws Exception {
    if (enabled.get()) {
        Date date = new Date();
        JobExecution jobExecution = jobLauncher()
          .run(job(), new JobParametersBuilder()
            .addDate("launchDate", date)
            .toJobParameters());
        batchRunCounter.incrementAndGet();
    }
}
//stop, start functions (changing the flag of enabled)

変数

batchRunCounter

は、統合テストでバッチジョブが停止したかどうかを確認するために使用されます。

3.スケジュールされたSpring Batch Jobを停止する

上記の条件付きフラグを使用すると、スケジュール設定されたタスクを有効にしてスケジュール設定されたSpring Batchジョブを起動できます。

仕事を再開する必要がない場合は、スケジュールされたタスクを実際に停止してリソースを節約できます。

次の2つのサブセクションで2つの選択肢を見てみましょう。

3.1. スケジューラポストプロセッサの使用



@Scheduled


アノテーションを使用してメソッドをスケジュールしているので、Beanの投稿プロセッサhttps://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/ScheduledAnnotationBeanPostProcessor.html[

ScheduledAnnotationBeanPostProcessor

]が最初に登録されているはずです。

明示的に

postProcessBeforeDestruction()

を呼び出して、指定されたスケジュール済みBeanを破棄することができます。

@Test
public void stopJobSchedulerWhenSchedulerDestroyed() throws Exception {
    ScheduledAnnotationBeanPostProcessor bean = context
      .getBean(ScheduledAnnotationBeanPostProcessor.class);
    SpringBatchScheduler schedulerBean = context
      .getBean(SpringBatchScheduler.class);
    await().untilAsserted(() -> Assert.assertEquals(
      2,
      schedulerBean.getBatchRunCounter().get()));
    bean.postProcessBeforeDestruction(
      schedulerBean, "SpringBatchScheduler");
    await().atLeast(3, SECONDS);

    Assert.assertEquals(
      2,
      schedulerBean.getBatchRunCounter().get());
}

複数のスケジューラを検討する場合は、1つのスケジューラを独自のクラスに保持するほうがよいため、必要に応じて特定のスケジューラを停止できます。

3.2. 予定されている__今後のキャンセル

スケジューラを停止するもう1つの方法は、その

Future

を手動でキャンセルすることです。

これは

Future

マップをキャプチャするためのカスタムタスクスケジューラです:

@Bean
public TaskScheduler poolScheduler() {
    return new CustomTaskScheduler();
}

private class CustomTaskScheduler
  extends ThreadPoolTaskScheduler {

   //
    @Override
    public ScheduledFuture<?> scheduleAtFixedRate(
      Runnable task, long period) {
        ScheduledFuture<?> future = super
          .scheduleAtFixedRate(task, period);

        ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
        scheduledTasks.put(runnable.getTarget(), future);

        return future;
    }
}

次に、

Future

マップを繰り返して、バッチジョブスケジューラの

Future

をキャンセルします。

public void cancelFutureSchedulerTasks() {
    scheduledTasks.forEach((k, v) -> {
        if (k instanceof SpringBatchScheduler) {
            v.cancel(false);
        }
    });
}

複数のスケジューラタスクがある場合は、カスタムスケジューラプール内で

Future

マップを維持しながら、スケジューラクラスに基づいて対応するスケジュールされた

Future

をキャンセルできます。

4.まとめ

このクイック記事では、スケジュールされたSpring Batchジョブを起動または停止するための3つの方法を試しました。

バッチジョブを再開する必要がある場合は、条件付きフラグを使用してジョブの実行を管理することが柔軟な解決策になります。それ以外の場合は、他の2つの方法でスケジューラを完全に停止できます。

いつもどおり、この記事で使用されているすべてのコード・サンプルはhttps://github.com/eugenp/tutorials/tree/master/spring-batch[over on GitHub]にあります。