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
獲取資料庫連線物件來進行運算元據,所運算元據表的表結構是固定的,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);
複製程式碼
刪除任務的順序如下:
- 暫停觸發器
- 移除觸發器
- 刪除任務 本章原始碼地址:github.com/hengboy/api…