ホームページ  >  記事  >  Java  >  Quartz を SpringBoot と統合する方法

Quartz を SpringBoot と統合する方法

PHPz
PHPz転載
2023-05-10 18:46:06869ブラウズ

基本的な依存関係

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.5.2</version>
</dependency>

Quartz は、単一アプリケーション プロジェクトで一般的に使用されるスケジュールされたタスク フレームワークです。スケジュールされたタスクは主に次のように分類できます。

  • メモリ内のタスク : 通常、プロジェクトが再起動された場合、タスクが再起動されていない場合は、プロジェクト内に定義され、保存されます。自動的に実行され、再度オンになることはありません。

  • 永続タスク: タスクの特性をデータベースに保存し、プロジェクトの再起動後に、最初に実行していたタスクを再読み込みして実行を継続できます。

cron 式

corn は、タスクがトリガーされる時間を制御するために使用されます。

一般的に使用されるものをいくつかリストします:

  • Trigger each Second

"* * * * * *":
  • Every 5 Execute 1 秒に 1 回

*/5 * * * * ?
  • 1 分ごとにトリガー

"0 * * * * ?"
  • 毎日 10 時に 1 回トリガー

"0 * * * * ?"
  • 毎日 0 時に 1 回トリガーo' Clock

"0 0 10 * * ?"
    General
  • @EnableScheduling
  • アノテーションをスタートアップ クラスに追加する必要があります。

メモリ タスク

プロジェクトの開始時に実行されるタスク実行タスクを直接定義します。例:

毎秒出力

テスト

"0 0 0 * * ?"

起動クラス:

@Service
public class ScheduleTest {

    @Scheduled(cron = "0/1 * * * * *")
    public void test() {
        System.out.println("测试");
    }
}

起動後、対応する内容がコンソールに出力されます。 タスクを手動で制御する

ここでは、タスクを自分で定義する必要があります。

タスクの定義

Job

インターフェイスを実装すると、タスクを定義でき、このタスクの開始を手動で制御できます。

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

Web コントローラーを使用してこのタスクを開始します

依存関係のインポート:<pre class="brush:java;">public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println(&quot;自定义任务&quot;); } }</pre>コントローラーの書き込み、これは固定された書き込み方法です。

タスクを指定します:

JobBuilder.newJob(task.class) .withIdentity(タスク名, タスクグループ).build();

  • cron 式を指定してトリガーを作成します:

  • CronScheduleBuilder.cronSchedule(cron 式);

    • TriggerBuilder.newTrigger().withIdentity(イニシエーター名、スターターグループ) .withSchedule(cron).build();

    • #タスクの呼び出し:

      scheduler.scheduleJob (タスク タイプ オブジェクト、ランチャー オブジェクト)

    • <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
          <version>2.3.6.RELEASE</version>
      </dependency>
    ブラウザを通じてプロジェクトのアドレスを入力します。デフォルトは
  • localhost:8080 です。 /addSchedule

    と入力すると、タスク実行の出力内容がコンソールに出力されていることがわかります。 Persistence

  • プロジェクトが再起動されても、上記の
SimpleJob

スケジュールされたタスクは再起動されません。解決策はタスクを永続化することです。Quartz が解決策を提供し、SpringBoot がこの操作を簡素化します。構成する必要があるのは、データベース、データ ソース、およびデータベースを操作するための JDBC だけです。

依存関係:

/**
 * @ClassName
 * @Description
 * @Author:chengyunlai
 * @Date
 * @Version 1.0
 **/
@RestController
public class DynamicScheduleController {

    @Autowired
    private Scheduler scheduler;

    @GetMapping("/addSchedule")
    public String addSchedule() throws SchedulerException {
        int random = ThreadLocalRandom.current().nextInt(1000);
        // 1. 创建JobDetail,指定定时任务实现类的类型
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("test-schedule" + random, "test-group").build();
        // 2. 创建Trigger,并指定每3秒执行一次
        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group")
                .withSchedule(cron).build();

        // 3. 调度任务
        scheduler.scheduleJob(jobDetail, trigger);
        return "success";
    }

mysql データベースを使用します: そのドライバー mysql-connector-java をインポートします。

Druid をデータ ソースとして使用します: druid。

  • spring-jdbc を使用すると、タスク情報をデータベースに自動的に保存できます。

  • #構成

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>

    Quartz は SQL データ テーブルを用意しました
  • 公式 Web サイト: ダウンロード (quartz-scheduler.org)

    例として、quartz-2.3.0-SNAPSHOT を取り上げます。
ソース コードをダウンロードした後、ディレクトリ

jdbcjobstore

:

quartz- を見つけます。 2.3.0-SNAPSHOT \src\org\quartz\impl\jdbcjobstore

次に、一連の

sql ファイルがあるので、データベースに一致する SQL ファイルを見つけてください。私は mysql を使用します。

SQL ファイルを実行してテーブルを作成します。データベース名は

scheduled

です。URL から確認できるはずです。 テーブルの作成が完了したら、すべての構成作業が終了します。プログラムを起動し、ブラウザに「

localhost:8080/addSchedule

」と再入力し、データベースを更新すると、次のことがわかります。タスクが永続化されていること プロジェクトを再起動した後も、タスクは引き続き自動的に実行されます。 Quartz を SpringBoot と統合する方法

タスクの一時停止とタスクの削除

タスクを手動で開始するときは、以下を指定します:

タスクの名前とグループ

# 设置将定时任务的信息保存到数据库
spring.quartz.job-store-type=jdbc

# 每次应用启动的时候都初始化数据库表结构
# 如果 spring.quartz.jdbc.initialize-schema 设置为 always 的话有个问题:每次重启应用的时候,跟 Quartz 相关的表会被删除重建!
# 所以为了避免表被重复创建,我们可以提前创建表,然后将其指定为never
spring.quartz.jdbc.initialize-schema=never

# 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/scheduled?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root

タスクを一時停止および再開する場合は、

JobKey.jobKey (タスク名、タスク グループ)

を使用して
    JobKey
  • を取得する必要があります。 use

    scheduler.pauseJob(jobkey)

    はタスクを一時停止でき、
  • scheduler.resumeJob(jobKey)
はタスクを再開します。

タスクを削除するときは、タスクとトリガーの両方を削除する必要があります。上記で、タスクを表す jobkey を取得できます。また、同様に、ランチャーの名前とグループも定義しました。

JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();

    TriggerKey.triggerKey((ランチャーの名前、ランチャーのグループ);
  • ランチャーを表す

    trigger を取得することもできます。

    • 通过以下顺序完整删除任务

      • scheduler.deleteJob(jobKey);

      • scheduler.unscheduleJob(triggerKey);

      • scheduler.pauseTrigger(triggerKey);

      • // 停止触发器

      • // 移除触发器

      • // 删除任务

    // 暂停
    @GetMapping("/pauseSchedule")
    public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        // 获取定时任务
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null) {
            return "error";
        }
        scheduler.pauseJob(jobKey);
        return "success";
    }
    
    // 恢复
    @GetMapping("/remuseSchedule")
    public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        // 获取定时任务
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null) {
            return "error";
        }
        scheduler.resumeJob(jobKey);
        return "success";
    }
    
    // 删除定时任务
    @GetMapping("/removeSchedule")
    public String removeSchedule(String jobName, String jobGroup, String triggerName, String triggerGroup) throws SchedulerException {
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    
        Trigger trigger = scheduler.getTrigger(triggerKey);
        if (trigger == null) {
            return "error";
        }
        // 停止触发器
        scheduler.pauseTrigger(triggerKey);
        // 移除触发器
        scheduler.unscheduleJob(triggerKey);
        // 删除任务
        scheduler.deleteJob(jobKey);
        return "success";
    }

以上がQuartz を SpringBoot と統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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