基於Spring Boot Quartz開發的JavaLib-quartz,目的是幫你快速構建定時任務系統,你可以專心編寫你的業務邏輯,而不必關注定時任務具體是如何實現的,他的性能如何,有沒有異常以及異常處理,監控等等問題。這些你可以在文檔中得知。
快速使用
第1步、添加依賴
<!-- 測試版需要指定倉庫 -->
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.fengwenyi</groupId>
<artifactId>JavaLib-quartz</artifactId>
<version>1.0-gamma</version>
</dependency>
</dependencies>
第2步、HelloTask.java
package com.fengwenyi.example.javalib_quartz.start;
import com.fengwenyi.javalib.quartz.QuartzTask;
import org.springframework.stereotype.Component;
/**
* @author Wenyi Feng
*/
@Component
public class HelloTask extends QuartzTask {
}
第3步、HelloJob.java
package com.fengwenyi.example.javalib_quartz.start;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
/**
* @author Wenyi Feng
*/
public class HelloJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello : " + new Date());
}
}
第4步、HelloController.java
package com.fengwenyi.example.javalib_quartz.start;
import com.fengwenyi.javalib.quartz.ScheduleBean;
import com.fengwenyi.javalib.quartz.TimeTypeEnum;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
* @author Wenyi Feng
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
private Scheduler scheduler;
@Autowired
private HelloTask helloTask;
@RequestMapping("/job")
public boolean job() {
String jobName = "JOB";
String triggerName = "TRIGGER";
ScheduleBean scheduleBean = new ScheduleBean(scheduler, HelloJob.class, jobName, triggerName);
scheduleBean.setTimeType(TimeTypeEnum.AT_TIME);
scheduleBean.setAtTime(System.currentTimeMillis() + 1000 * 10); // 10s之後運行
boolean rs = false;
try {
rs = helloTask.start(scheduleBean);
System.out.println("cTime : " + new Date());
} catch (SchedulerException e) {
e.printStackTrace();
}
return rs;
}
}
第5步、瀏覽器訪問
http://localhost:8080/hello/job
如果看到 true
,那就繼續下一步,否則就是出錯了,需要去檢查錯誤。
第6步、運行效果
API
名稱 | 方法 | 參數 | 返回類型 | 說明 |
---|---|---|---|---|
開啓定時任務 | start | (ScheduleBean) | boolean | 開啓是否成功,true:成功,false:失敗 |
定時任務當前狀態 | status | - | boolean | 定時任務當前狀態,true:運行中,false:已停止 |
停止定時任務 | stop | - | boolean | 定時任務停止是否成功,true:成功,false:失敗 |
ScheduleBean字段說明
名稱 | 參數 | 類型 | 說明 |
---|---|---|---|
Scheduler | scheduler | Scheduler | Scheduler 對象 |
編號 | id | Long | -,保留字段 |
名稱 | name | String | -,保留字段 |
描述 | description | String | -,保留字段 |
選用類型 | timeTime | TimeTypeEnum | 選用構造Trigger對象類型 |
job類 | clazz | Class | 定時任務執行的job類 |
job參數 | paramJobMap | Map | 定時任務執行的job類 |
job類 | paramTriggerMap | Map | 定時任務執行的job類 |
cron表達式 | cron | String | cron表達式 |
時間間隔 | time | Integer | 每隔一段時間執行一次 |
時間間隔 | atTime | Long | 指定一個時間點執行(毫秒數) |
Job名稱 | jobName | String | Job名稱 |
Job組 | jobGroup | String | Job組名稱 |
TriggerName | triggerName | String | Trigger名稱 |
Trigger組 | triggerGroup | String | Trigger組名稱 |
TimeTypeEnum
字段說明
字段 | 類型 | 說明 |
---|---|---|
code | Integer | 代碼 |
msg | String | 說明 |
值說明
名稱 | 代碼 | 說明 |
---|---|---|
SIMPLE | 1 | 簡單的定時任務,每隔一段時間執行一次 |
AT_TIME | 2 | 指定一個時間點執行(毫秒數[Long]) |
CRON | 3 | 使用cron表達式(時間點、循環、自定義時間) |
wiki
一、需要在Job中注入Service
使用 @Autowired
註解
@Autowired
private DBService dbService;
二、每隔一段時間執行一次
int time;
ScheduleBean scheduleBean;
scheduleBean.setTimeType(TimeTypeEnum.SIMPLE);
scheduleBean.setTime(time);
三、指定一個時間點執行一次
long atTime;
ScheduleBean scheduleBean;
scheduleBean.setTimeType(TimeTypeEnum.AT_TIME);
scheduleBean.setAtTime(atTime);
四、通過使用cron表達式執行
String cron;
ScheduleBean scheduleBean;
scheduleBean.setTimeType(TimeTypeEnum.CRON);
scheduleBean.setCron(cron);
五、參數
// 將參數放到job中
Map<String, Object> jobMap;
ScheduleBean scheduleBean;
scheduleBean.setParamJobMap(jobMap);
// 將參數放到trigger中
Map<String, Object> triggerMap;
ScheduleBean scheduleBean;
scheduleBean.setParamTriggerMap(triggerMap);
六、關於在job獲取參數
兩種思路: 一是通過map的key獲取值, 二是通過構造與map的key相同的屬性,提供set方法
// 獲取自己的參數
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
jobDataMap.getInt("");
jobDataMap.getString("");
jobDataMap.getFloat("");
jobDataMap.getDouble("");
JobDataMap triggerDataMap = context.getTrigger().getJobDataMap();
// 合併
// 如果job和trigger的key相同,trigger會覆蓋job的值
JobDataMap dataMap = context.getMergedJobDataMap();
七、在job中獲取jobDetail、trigger基礎信息
// 獲取jobDetail相關
JobKey jobKey = context.getJobDetail().getKey();
jobKey.getName();
jobKey.getGroup();
jobKey.getClass().getName();
// 獲取trigger相關
TriggerKey triggerKey = context.getTrigger().getKey();
triggerKey.getName();
triggerKey.getGroup();
八、task目前支持的方法
開啓任務:start
查看當前任務狀態:status
停止任務:stop
策略
1、優先選用指定方式構造Trigger
2、檢查順序:cron->atTime->simple,執行順序:simple > atTime > cron 自下而上進行覆蓋
資料
About Me
©author Wenyi Feng
Licensed
Copyright 2018 Wenyi Feng([email protected])
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.