ApiBoot - ApiBoot Quartz 使用文檔

ApiBoot Quartz

ApiBoot內部集成了Quartz,提供了數據庫方式內存方式的進行任務的存儲,其中數據庫方式提供了分佈式集羣任務調度,任務自動平滑切換執行節點。java

引用ApiBoot Quartz

pom.xml配置文件內添加,以下配置:git

<!--ApiBoot Quartz-->
<dependency>
  <groupId>org.minbox.framework</groupId>
  <artifactId>api-boot-starter-quartz</artifactId>
</dependency>
複製代碼

備註:若是使用ApiBoot Quartz的內存方式,僅須要添加上面的依賴便可。github

相關配置

參數名稱 是否必填 默認值 描述
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

api:
 boot:
 quartz:
      # Jdbc方式
 job-store-type: jdbc
複製代碼

Quartz所需表結構

Quartz的數據庫方式內部經過DataSource獲取數據庫鏈接對象來進行操做數據,所操做數據表的表結構是固定的,ApiBootQuartz所支持的全部表結構都進行了整理,訪問Quartz支持數據庫建表語句列表查看,複製執行對應數據庫語句便可。app

建立任務類

咱們只須要讓新建類集成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類型數據。ide

任務Key默認值

ApiBoot QuartznewJob方法所建立的定時任務,若是在不傳遞Job Key參數時,會默認使用UUID隨機字符串做爲Job Key以及Trigger Keyoop

自定義任務開始時間

任務開始時間能夠經過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 開源交流羣
相關文章
相關標籤/搜索