1. 概要

このチュートリアルでは、JobRunrを使用したJavaでの分散バックグラウンドジョブのスケジューリングと処理を調べ、Springと統合します。

2. JobRunrについて

JobRunrは、アプリケーションに埋め込むことができるライブラリであり、Java8ラムダを使用してバックグラウンドジョブをスケジュールできます。Springサービスの既存のメソッドを使用して、実装せずにジョブを作成できます。インターフェイス。 ジョブは短時間または長時間実行されるプロセスである可能性があり、現在のWeb要求がブロックされないように、バックグラウンドスレッドに自動的にオフロードされます。

その仕事をするために、JobRunrはJava8ラムダを分析します。 JSONとしてシリアル化し、リレーショナルデータベースまたはNoSQLデータストアに保存します。

3. JobRunrの機能

生成しているバックグラウンドジョブが多すぎてサーバーが負荷に対応できない場合は、アプリケーションのインスタンスを追加するだけで、簡単に水平方向にスケーリングできます。 JobRunrは負荷を自動的に共有し、アプリケーションのさまざまなインスタンスにすべてのジョブを分散します。

また、失敗したジョブに対する指数バックオフポリシーを備えた自動再試行機能も含まれています。 組み込みのダッシュボードもあり、すべてのジョブを監視できます。 JobRunrは自己管理型です– 成功したジョブは、構成可能な時間が経過すると自動的に削除されますので、手動でストレージのクリーンアップを実行する必要はありません。

4. 設定

簡単にするために、メモリ内のデータストアを使用してすべてのジョブ関連情報を格納します。

4.1. Maven構成

Javaコードに直接ジャンプしましょう。 ただし、その前に、pom.xmlファイルで次のMaven依存関係を宣言する必要があります。

<dependency>
    <groupId>org.jobrunr</groupId>
    <artifactId>jobrunr-spring-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>

4.2. 春の統合

バックグラウンドジョブの作成方法に直接ジャンプする前に、JobRunrを初期化する必要があります。 jobrunr-spring-boot-starter 依存関係を使用しているため、これは簡単です。 application.propertiesにいくつかのプロパティを追加するだけで済みます。

org.jobrunr.background-job-server.enabled=true
org.jobrunr.dashboard.enabled=true

最初のプロパティは、ジョブの処理を担当するBackgroundJobServerのインスタンスを開始することをJobRunrに通知します。 2番目のプロパティは、埋め込みダッシュボードを開始するようにJobRunrに指示します。

デフォルトでは、 jobrunr-spring-boot-starter は、リレーショナルデータベースの場合、既存の DataSource を使用して、すべてのジョブ関連情報を格納しようとします。

ただし、メモリ内のデータストアを使用するため、StorageProviderBeanを提供する必要があります。

@Bean
public StorageProvider storageProvider(JobMapper jobMapper) {
    InMemoryStorageProvider storageProvider = new InMemoryStorageProvider();
    storageProvider.setJobMapper(jobMapper);
    return storageProvider;
}

5. 使用法

それでは、JobRunrを使用してSpringでバックグラウンドジョブを作成およびスケジュールする方法を見てみましょう。

5.1. 依存関係を注入する

ジョブを作成するときは、 JobScheduler と、ジョブを作成するメソッド(この場合は SampleJobService )を含む既存のSpringサービスを挿入する必要があります。

@Inject
private JobScheduler jobScheduler;

@Inject
private SampleJobService sampleJobService;

JobRunrのJobSchedulerクラスを使用すると、新しいバックグラウンドジョブをキューに入れたりスケジュールしたりできます。

SampleJobService は、Webリクエストで処理するのに時間がかかりすぎる可能性のあるメソッドを含む既存のSpringサービスのいずれかである可能性があります。 また、例外が発生した場合にJobRunrがメソッドを再試行するため、復元力を追加したい他の外部サービスを呼び出すメソッドにすることもできます。

5.2. ファイアアンドフォーゲットジョブの作成

依存関係ができたので、enqueueメソッドを使用してファイアアンドフォーゲットジョブを作成できます。

jobScheduler.enqueue(() -> sampleJobService.executeSampleJob());

他のラムダと同じように、ジョブはパラメーターを持つことができます。

jobScheduler.enqueue(() -> sampleJobService.executeSampleJob("some string"));

この行は、ラムダ(型、メソッド、引数を含む)がJSONとして永続ストレージ(Oracle、Postgres、MySql、MariaDBなどのRDBMSまたはNoSQLデータベース)にシリアル化されることを確認します。

すべての異なるBackgroundJobServerで実行されているスレッドの専用ワーカープールは、これらのキューに入れられたバックグラウンドジョブを、先入れ先出し方式でできるだけ早く実行します。 JobRunrは、楽観的なロックによって、単一のワーカーによるジョブの実行を保証します。

5.3. 将来のジョブのスケジューリング

schedule メソッドを使用して、将来ジョブをスケジュールすることもできます。

jobScheduler.schedule(LocalDateTime.now().plusHours(5), () -> sampleJobService.executeSampleJob());

5.4. ジョブを繰り返しスケジュールする

繰り返しジョブが必要な場合は、scheduleRecurrentlyメソッドを使用する必要があります。

jobScheduler.scheduleRecurrently(Cron.hourly(), () -> sampleJobService.executeSampleJob());

5.5. @Jobアノテーションによるアノテーション

ジョブのすべての側面を制御するために、サービスメソッドに@Jobアノテーションを付けることができます。 これにより、ダッシュボードでの表示名の設定と、ジョブが失敗した場合の再試行回数の構成が可能になります。

@Job(name = "The sample job with variable %0", retries = 2)
public void executeSampleJob(String variable) {
    ...
}

String.format()構文を使用して、表示名でジョブに渡される変数を使用することもできます。

特定の例外でのみ特定のジョブを再試行したいという非常に特殊なユースケースがある場合は、Jobとフルコントロールにアクセスできる独自のElectStateFilterを作成できます。続行する方法について。

6. ダッシュボード

JobRunrには、ジョブを監視できるダッシュボードが組み込まれています。 http:// localhost:8000 で見つけることができ、すべての定期的なジョブと、キューに入れられたすべてのジョブが処理されるまでにかかる時間の見積もりを含む、すべてのジョブを検査します。

SSL証明書の有効期限が切れている、ディスクがいっぱいであるなど、問題が発生する可能性があります。 JobRunrは、デフォルトで、指数バックオフポリシーを使用してバックグラウンドジョブを再スケジュールします。 バックグラウンドジョブが10回失敗し続ける場合、その場合にのみFailed状態になります。 その後、根本的な原因が解決されたときに、失敗したジョブを再キューイングすることを決定できます。

正確なエラーメッセージとジョブが失敗した理由の完全なスタックトレースを含む各再試行を含め、これらすべてがダッシュボードに表示されます。

7. 結論

この記事では、JobRunrとjobrunr-spring-boot-starterを使用して最初の基本的なスケジューラーを構築しました。 このチュートリアルの重要なポイントは、1行のコードで、XMLベースの構成やインターフェイスの実装を必要とせずにジョブを作成できたことです。

この例の完全なソースコードは、GitHubから入手できます。