ApiBoot
內部集成了Quartz
,提供了數據庫方式
、內存方式
的進行任務的存儲,其中數據庫
方式提供了分佈式集羣任務調度
,任務自動平滑切換執行節點。java
在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
的數據庫方式內部經過DataSource
獲取數據庫鏈接對象來進行操做數據,所操做數據表的表結構是固定的,ApiBoot
把Quartz
所支持的全部表結構都進行了整理,訪問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
ApiBoot Quartz
的newJob
方法所建立的定時任務,若是在不傳遞Job Key
參數時,會默認使用UUID
隨機字符串做爲Job Key
以及Trigger Key
。oop
任務開始時間能夠經過startAtTime
方法進行設置,在不設置的狀況下,任務建立完成後會馬上執行。測試
建立Cron
類型任務以下所示:
String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context()
.jobClass(DemoJob.class)
.cron("0/5 * * * * ?")
.param(
ApiBootJobParamWrapper.wrapper().put("param", "測試"))
.wrapper());
複製代碼
Cron 表達式任務由ApiBootCronJobWrapper
類進行構建。
上面的DemoJob
任務類將會每隔5秒
執行一次。
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
一次性任務,任務執行一次會就會被自動釋放,以下所示:
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
表達式的場景以下:
修改方法以下所示:
// 修改執行Job Key任務的Cron表達式
apiBootQuartzService.updateJobCron(jobKey, "0/5 * * * * ?");
複製代碼
想要手動釋聽任務時可使用以下方式:
// 手動刪除指定Job Key任務
apiBootQuartzService.deleteJob(jobKey);
// 手動刪除多個任務
apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey);
複製代碼
刪除任務的順序以下: