ShedLockとSpringのガイド

Springを使用したShedLockのガイド

1. 概要

Springは、ジョブをスケジュールするための実装しやすいAPIを提供します。 アプリケーションの複数のインスタンスをデプロイするまで、それはうまくいきます。 デフォルトでは、Springは複数のインスタンスでスケジューラの同期を処理できず、代わりにすべてのノードで同時にジョブを実行します。

この短いチュートリアルでは、ShedLockについて説明します。これは、スケジュールされたタスクが同時に1回だけ実行されるようにするJavaライブラリですand is an alternative to Quartz.

2. Mavenの依存関係

SpringでShedLockを使用するには、 the shedlock-spring dependencyを追加する必要があります。


    net.javacrumbs.shedlock
    shedlock-spring
    2.2.0

3. 設定

Note that ShedLock works only in environments with a shared database.データベースにテーブルまたはドキュメントを作成し、現在のロックに関する情報を格納します。

現在、ShedLockはMongo、Redis、Hazelcast、ZooKeeper、およびJDBCドライバーを備えたあらゆるものをサポートしています。

この例では、we’ll use a PostgreSQL database.を機能させるために、ShedLock’s JDBC dependencyを指定する必要があります。


    net.javacrumbs.shedlock
    shedlock-provider-jdbc-template
    2.1.0

次に、ShedLockのデータベーステーブルを作成して、スケジューラロックに関する情報を保持する必要があります。

CREATE TABLE shedlock(
  name VARCHAR(64),
  lock_until TIMESTAMP(3) NULL,
  locked_at TIMESTAMP(3) NULL,
  locked_by  VARCHAR(255),
  PRIMARY KEY (name)
)

提供する必要のあるもう1つの構成要件は、Spring構成クラスの@EnableSchedulingおよび@EnableSchedulerLockアノテーションです。

@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SpringApplication {

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

defaultLockAtMostForパラメータは、実行中のノードが停止した場合にロックを保持するデフォルトの時間を指定します。 ISO8601 Duration形式を使用します。

次のセクションでは、このデフォルトを上書きする方法を説明します。

4. タスクを作成する

ShedLockによって処理されるスケジュールされたタスクを作成するには、メソッドに@Scheduledおよび@SchedulerLockアノテーションを配置するだけです。

@Component
class TaskScheduler {

    @Scheduled(cron = "*/15 * * * *")
    @SchedulerLock(name = "TaskScheduler_scheduledTask",
      lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
    public void scheduledTask() {
        // ...
    }
}

まず、@Scheduledを見てみましょう。 the cron formatをサポートし、この式は「15分ごと」を意味します。

次に、@SchedulerLock,を見ると、nameパラメータは一意である必要があり、通常はClassName_methodNameで十分です。 このメソッドの複数の実行が同時に発生することは望ましくありません。ShedLockは一意の名前を使用してそれを実現します。

また、いくつかのオプションのパラメータを追加しました。

まず、lockAtLeastForStringを追加して、メソッドの呼び出しの間にある程度の距離を置くことができるようにしました。 “PT5M” を使用するということは、このメソッドが少なくとも5分間ロックを保持することを意味します。 言い換えれば、that means that this method can be run by ShedLock no more often than every five minutes.

次に、lockAtMostForStringを追加して、実行中のノードが停止した場合にロックを保持する期間を指定しました。 “PT14M” を使用すると、14分以内にロックされます。

通常の状況では、ShedLockはタスクが終了した直後にロックを解除します。 さて、実際には、there is a default provided in*@EnableSchedulerLock*,であるため、これを行う必要はありませんでしたが、ここではそれをオーバーライドすることを選択しました。

5. 結論

この記事では、ShedLockを使用してスケジュールされたタスクを作成および同期する方法を学習しました。

いつものように、すべてのソースコードはover on GitHubで利用できます。