ホームページ  >  記事  >  Java  >  Quartz を使用して Java 高可用性スケジュール済みタスクを実装するにはどうすればよいですか?

Quartz を使用して Java 高可用性スケジュール済みタスクを実装するにはどうすればよいですか?

WBOY
WBOY転載
2023-05-07 12:55:071322ブラウズ

スケジュールされたタスクの使用ガイド

スケジュールされたタスクを実行したい場合、 高可用性の要件がある場合、または単に すぐに開始したい場合、 簡単に開始したい場合、次に、[まさにそのとおりです] を選択します。

スケジュールされたタスク モジュールは、Quartz フレームワークをさらにカプセル化し、使いやすくします。

1. 依存関係を導入する

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-quartz</artifactId>
    <version>1.5.4.1</version>
</dependency>

2. すぐに始めましょう

org.quartz.Job インターフェイスを実装し、アノテーションを使用しますCronExp タスクのスケジュール戦略を追加します。アノテーション Component を使用してタスクをコンテナに挿入します。

プロジェクトを開始すると、スケジュールされたタスクが監視され、実行されます。

@Component
@DisallowConcurrentExecution
@CronExp(cron = "0/5 * * * * ?")
public class DemoJob implements Job {
    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("任务1:" + LocalDateTime.now());
    }
}

3. スケジュールされたタスクを手動でトリガーする

スケジュールされたタスクは、既存の頻度で定期的に実行されるだけでなく、インターフェイスを通じて手動でトリガーすることもできます。

次のインターフェイスを呼び出して、タスク ID 番号

jobId のタスクを手動でトリガーします。

http://localhost:8080/cms-api/quartz/job/{jobId}

スケジュールされたタスクを手動でトリガーする必要がある場合は、タスク ID は

Unique、 および known である必要があるため、スケジュールされたタスクを作成するときに手動で指定する必要があります。

@CronExp(id = 1, cron = "0/5 * * * * ?")

タスク ID は、

CronExp の id 属性にアノテーションを付けることで指定できます。タスク ID が明示的に指定されていない場合は、ランダムな ID が使用されます。既知の条件が満たされていないため、したがって、手動でトリガーすることはできません。

4. パラメーターを使用したタスク

ほとんどのタスクではパラメーターの注入は必要ありませんが、スケジュールされたタスクへのパラメーターの注入が必要なシナリオが少数ながら存在します。

public void execute(JobExecutionContext context) {
    /* 如果在调用任务时传入了参数,则能够从Map中获取 */
    Map<String, Object> dataMap = context.getMergedJobDataMap();
    /* 比如从Map中获取一个键值对,一般来说参数均为基本数据类型 */
    Object key = dataMap.get("key");
    System.out.println("任务2:" + LocalDateTime.now() + ": " + key);
}

スケジュールされたタスクを作成する場合、

JobExecutionContext オブジェクトからマップを解析して、パラメーターの挿入を完了できます。

http://localhost:8080/cms-api/quartz/job/1?key=a

上記の http 呼び出しの意味は、タスク ID [1] のタスクを手動でトリガーし、値 [a] のパラメーター [key] を渡すことです。

5. タスクの同時実行性

このフレームワークはタスクの同時実行性をサポートしていません。つまり、同時実行性はスケジュールされたタスクには適していないため、手動で無効にする必要があります。

なお、

Quartz の同時実行性とは、タスクの実行時間がタスクのスケジューリング周期を超え、前のタスクが実行されていない場合に、新しいタスクを実行するかどうかを指します。

一般的には同時実行の禁止を表示する必要があるため、タスククラスに

DisallowConcurrentExecution アノテーションを追加してタスクの同時実行を無効にします。

6. 永続性

スケジュールされたタスクに高可用性要件がある場合、タスクを永続化する必要があります。スケジュールされたタスクのデータがデータベースに保存されると、複数のアプリケーションを開くことができます。スケジュールされたタスクを永続的にマルチノードに展開した後は、クラスター内の単一ノードに障害が発生しても、スケジュールされたタスクの実行には影響しません。

時間指定タスクの永続性。コードを変更せずに、yml ファイル構成を変更するだけで目標を達成できます。一般に、Mysql は永続コンテナとして使用されます。

spring:
  quartz:
    properties:
      org.quartz.jobStore.isClustered: true
      org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
      org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
      org.quartz.jobStore.dataSource: qzDS
      org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver
      org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo
      org.quartz.dataSource.qzDS.user: root
      org.quartz.dataSource.qzDS.password: 123456

ホスト、ポート、データベース名、ユーザー名、パスワードの 5 つのパラメーターの変更を除き、他のパラメーターはデフォルト値を使用できます。

データベース接続を構成した後、SQL スクリプトを使用し、データベースの初期化に注意してください

以上がQuartz を使用して Java 高可用性スケジュール済みタスクを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。