基於Spring Boot Quartz開發的JavaLib-quartz,目的是幫你快速構建定時任務系統,你能夠專心編寫你的業務邏輯,而沒必要關注定時任務具體是如何實現的,他的性能如何,有沒有異常以及異常處理,監控等等問題。這些你能夠在文檔中得知。java
第1步、添加依賴git
<!-- 測試版須要指定倉庫 --> <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.javagithub
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.javaweb
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.javaspring
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步、瀏覽器訪問express
http://localhost:8080/hello/job
若是看到 true
,那就繼續下一步,不然就是出錯了,須要去檢查錯誤。apache
第6步、運行效果api
名稱 | 方法 | 參數 | 返回類型 | 說明 |
---|---|---|---|---|
開啓定時任務 | start | (ScheduleBean) | boolean | 開啓是否成功,true:成功,false:失敗 |
定時任務當前狀態 | status | - | boolean | 定時任務當前狀態,true:運行中,false:已中止 |
中止定時任務 | stop | - | boolean | 定時任務中止是否成功,true:成功,false:失敗 |
名稱 | 參數 | 類型 | 說明 |
---|---|---|---|
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組名稱 |
字段說明瀏覽器
字段 | 類型 | 說明 |
---|---|---|
code | Integer | 代碼 |
msg | String | 說明 |
值說明app
名稱 | 代碼 | 說明 |
---|---|---|
SIMPLE | 1 | 簡單的定時任務,每隔一段時間執行一次 |
AT_TIME | 2 | 指定一個時間點執行(毫秒數[Long]) |
CRON | 3 | 使用cron表達式(時間點、循環、自定義時間) |
1、須要在Job中注入Service
使用 @Autowired
註解
@Autowired private DBService dbService;
2、每隔一段時間執行一次
int time; ScheduleBean scheduleBean; scheduleBean.setTimeType(TimeTypeEnum.SIMPLE); scheduleBean.setTime(time);
3、指定一個時間點執行一次
long atTime; ScheduleBean scheduleBean; scheduleBean.setTimeType(TimeTypeEnum.AT_TIME); scheduleBean.setAtTime(atTime);
4、經過使用cron表達式執行
String cron; ScheduleBean scheduleBean; scheduleBean.setTimeType(TimeTypeEnum.CRON); scheduleBean.setCron(cron);
5、參數
// 將參數放到job中 Map<String, Object> jobMap; ScheduleBean scheduleBean; scheduleBean.setParamJobMap(jobMap); // 將參數放到trigger中 Map<String, Object> triggerMap; ScheduleBean scheduleBean; scheduleBean.setParamTriggerMap(triggerMap);
6、關於在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();
7、在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();
8、task目前支持的方法
開啓任務:start
查看當前任務狀態:status
中止任務:stop
一、優先選用指定方式構造Trigger
二、檢查順序:cron->atTime->simple,執行順序:simple > atTime > cron 自下而上進行覆蓋
©author Wenyi Feng
Copyright 2018 Wenyi Feng(xfsy_2015@163.com) 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.