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
的記憶體方式,僅需要添加上面的依賴即可。
相關配置
參數名稱 | 是否必填 | 預設值 | 描述 |
---|---|---|---|
| 否 | memory | 任務存儲源方式,預設記憶體方式 |
| scheduler | 排程器名稱 | |
| true | 初始化後是否自動啟動排程程式 | |
| 初始化完成後啟動排程程式的延遲。 | ||
| false | 是否等待正在運作的作業在關閉時完成。 | |
| 配置的作業是否應覆寫現有的作業定義。 | ||
| Quartz自定義的配置屬性,具體參考quartz配置 | ||
| 配置資料庫方式的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);
删除任務的順序如下: