ApiBoot - ApiBoot Quartz 使用文件

恆宇少年發表於2019-04-04

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 0 初始化完成後啟動排程程式的延遲。
api.boot.quartz.wait-for-jobs-to-complete-on-shutdown false 是否等待正在執行的作業在關閉時完成。
api.boot.quartz.overwrite-existing-jobs false 配置的作業是否應覆蓋現有的作業定義。
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獲取資料庫連線物件來進行運算元據,所運算元據表的表結構是固定的,ApiBootQuartz所支援的所有表結構都進行了整理,訪問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 QuartznewJob方法所建立的定時任務,如果在不傳遞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 KeyJob 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. 刪除任務 本章原始碼地址:github.com/hengboy/api…

ApiBoot 開源交流群

相關文章