1.概要

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

この短いチュートリアルでは、ShedLock、つまりスケジュールされたタスクが一度に1回だけ実行されることを保証し、https://www.baeldung.com/quartz[Quartz].** の代替となるJavaライブラリです。

2. Mavenの依存関係

SpringでShedLockを使うには

__https://search.maven.org/search?q = g:net.javacrumbs.shedlock%20AND 20a:shedlock-spring&core = gav[

shedlock-spring__依存関係]を追加する必要があります。

<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>2.2.0</version>
</dependency>

3.設定

  • ShedLockは共有データベースがある環境でのみ機能することに注意してください** 現在のロックに関する情報を格納するデータベースにテーブルまたはドキュメントを作成します。

現在、ShedLockはMongo、Redis、Hazelcast、ZooKeeper、およびJDBCドライバを含むすべてのものをサポートしています。

この例では、

PostgreSQLデータベースを使用します

それを機能させるには、https://search.maven.org/search?q=g:net.javacrumbs.shedlock%20AND%20a:shedlock- provider-jdbc-template

<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
    <version>2.1.0</version>
</dependency>

次に、スケジューラロックに関する情報を保持するために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

パラメーターは、実行中のノードが停止した場合にロックを保持するデフォルトの時間を指定します。それはhttps://en.wikipedia.org/wiki/ISO__8601#Durations[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分間ロックを保持することを意味します。つまり、** このメソッドはShedLockによって5分ごとに実行されることができるということです。

次に、

lockAtMostForString

を追加して、実行中のノードが停止した場合にロックを保持する期間を指定します。

__

“ PT14M”を使用すると、14分以内にロックされます。

通常の状況では、ShedLockはタスクが終了した直後にロックを解除します。

__

@ EnableSchedulerLock ** にはデフォルトが用意されているので、実際には、これを行う必要はありませんでした。

5.まとめ

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

いつものように、すべてのソースコードが入手可能ですhttps://github.com/eugenp/tutorials/tree/master/spring-boot-libraries【GitHubで利用可能]。