天天看點

ApiBoot - ApiBoot Quartz 使用文檔

ApiBoot Quartz

ApiBoot

内部內建了

Quartz

,提供了

資料庫方式

記憶體方式

的進行任務的存儲,其中

資料庫

方式提供了

分布式叢集任務排程

,任務自動平滑切換執行節點。

引用ApiBoot Quartz

pom.xml

配置檔案内添加,如下配置:

<!--ApiBoot Quartz-->
<dependency>
  <groupId>org.minbox.framework</groupId>
  <artifactId>api-boot-starter-quartz</artifactId>
</dependency>           
備注:如果使用

ApiBoot Quartz

的記憶體方式,僅需要添加上面的依賴即可。

相關配置

參數名稱 是否必填 預設值 描述

api.boot.quartz.job-store-type

memory 任務存儲源方式,預設記憶體方式

api.boot.quartz.scheduler-name

scheduler 排程器名稱

api.boot.quartz.auto-startup

true 初始化後是否自動啟動排程程式

api.boot.quartz.startup-delay

初始化完成後啟動排程程式的延遲。

api.boot.quartz.wait-for-jobs-to-complete-on-shutdown

false 是否等待正在運作的作業在關閉時完成。

api.boot.quartz.overwrite-existing-jobs

配置的作業是否應覆寫現有的作業定義。

api.boot.quartz.properties

Quartz自定義的配置屬性,具體參考quartz配置

api.boot.quartz.jdbc

配置資料庫方式的Jdbc相關配置

記憶體方式

ApiBoot Quartz

在使用記憶體方式存儲任務時,不需要做配置調整。

資料庫方式

需要在

application.yml

配置檔案内修改

api.boot.quartz.job-store-type

參數,如下所示:

api:
  boot:
    quartz:
      # Jdbc方式
      job-store-type: jdbc           

Quartz所需表結構

Quartz

的資料庫方式内部通過

DataSource

擷取資料庫連接配接對象來進行操作資料,所操作資料表的表結構是固定的,

ApiBoot

Quartz

所支援的所有表結構都進行了整理,通路

Quartz支援資料庫建表語句清單

檢視,複制執行對應資料庫語句即可。

建立任務類

我們隻需要讓建立類內建

QuartzJobBean

就可以完成建立一個任務類,如下簡單示例:

/**
 * 任務定義示例
 * 與Quartz使用方法一緻,ApiBoot隻是在原生基礎上進行擴充,不影響原生使用
 * <p>
 * 繼承QuartzJobBean抽象類後會在項目啟動時會自動加入Spring IOC
 *
 * @author:恒宇少年 - 于起宇
 * <p>
 * DateTime:2019-03-28 17:26
 * Blog:http://blog.yuqiyu.com
 * WebSite:http://www.jianshu.com/u/092df3f77bca
 * Gitee:https://gitee.com/hengboy
 * GitHub:https://github.com/hengboy
 */
public class DemoJob extends QuartzJobBean {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(DemoJob.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        logger.info("定時任務Job Key : {}", context.getJobDetail().getKey());
        logger.info("定時任務執行時所攜帶的參數:{}", JSON.toJSONString(context.getJobDetail().getJobDataMap()));
        //...處理邏輯
    }
}           

任務參數

在任務執行時傳遞參數是必須的,

ApiBoot Quartz

提供了比較友善的傳遞方式,不過最終

Quartz

會把傳遞的值都會轉換為

String

類型資料。

任務Key預設值

ApiBoot Quartz

newJob

方法所建立的定時任務,如果在不傳遞

Job Key

參數時,會預設使用

UUID

随機字元串作為

Job Key

以及

Trigger Key

自定義任務開始時間

任務開始時間可以通過

startAtTime

方法進行設定,在不設定的情況下,任務建立完成後會立刻執行。

Cron 表達式任務

建立

Cron

類型任務如下所示:

String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context()
                        .jobClass(DemoJob.class)
                        .cron("0/5 * * * * ?")
                        .param(
                                ApiBootJobParamWrapper.wrapper().put("param", "測試"))
                        .wrapper());           

Cron 表達式任務由

ApiBootCronJobWrapper

類進行建構。

上面的

DemoJob

任務類将會每隔

5秒

執行一次。

Loop 重複任務

Loop

循環任務,當在不傳遞重複執行次數時,不進行重複執行,僅僅執行一次,如下所示:

String jobKey = apiBootQuartzService.newJob(
                ApiBootLoopJobWrapper.Context()
                        // 參數
                        .param(
                                ApiBootJobParamWrapper.wrapper()
                                        .put("userName", "恒宇少年")
                                        .put("userAge", 24)
                        )
                        // 每次循環的間隔時間,機關:毫秒
                        .loopIntervalTime(2000)
                        // 循環次數
                        .repeatTimes(5)
                        // 開始時間,10秒後執行
                        .startAtTime(new Date(System.currentTimeMillis() + 10000))
                        // 任務類
                        .jobClass(DemoJob.class)
                        .wrapper()
        );           

Loop 任務由

ApiBootLoopJobWrapper

上面的定時任務将會重複執行

5次

,連上自身執行的一次也就是會執行

6次

,每次的間隔時間為

2秒

,在任務建立

10秒

後進行執行。

Once 一次性任務

Once

一次性任務,任務執行一次會就會被自動釋放,如下所示:

Map paramMap = new HashMap(1);
paramMap.put("paramKey", "參數值");

String jobKey = apiBootQuartzService.newJob(
  ApiBootOnceJobWrapper.Context()
  .jobClass(DemoJob.class)
  // 參數
  .param(
    ApiBootJobParamWrapper.wrapper()
    .put("mapJson", JSON.toJSONString(paramMap))
  )
  // 開始時間,2秒後執行
  .startAtTime(new Date(System.currentTimeMillis() + 2000))
  .wrapper()
);
           

Once 任務由

ApiBootOnceJobWrapper

在參數傳遞時可以是對象、集合,不過需要進行轉換成字元串才可以進行使用。

暫停任務執行

任務在執行過程中可以進行暫停操作,通過

ApiBoot Quartz

提供的

pauseJob

方法就可以很簡單的實作,當然暫停時需要傳遞

Job Key

Job Key

可以從建立任務方法傳回值獲得。

暫停任務如下所示:

// 暫停指定Job Key的任務
apiBootQuartzService.pauseJob(jobKey);
// 暫停多個執行中任務
apiBootQuartzService.pauseJobs(jobKey,jobKey,jobKey);           

恢複任務執行

任務執行完暫停後,如果想要恢複可以使用如下方式:

// 恢複指定Job Key的任務執行
apiBootQuartzService.resumeJob(jobKey);
// 恢複多個暫停任務
apiBootQuartzService.resumeJobs(jobKey,jobKey,jobKey);           

修改Cron表達式

修改

Cron

表達式的場景如下:

  • 已建立 & 未執行
  • 已建立 & 已執行

修改方法如下所示:

// 修改執行Job Key任務的Cron表達式
apiBootQuartzService.updateJobCron(jobKey, "0/5 * * * * ?");           

删除任務

想要手動釋放任務時可以使用如下方式:

// 手動删除指定Job Key任務
apiBootQuartzService.deleteJob(jobKey);
// 手動删除多個任務
apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey);           

删除任務的順序如下:

  1. 暫停觸發器
  2. 移除觸發器
  3. 本章源碼位址: https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-quartz