JavaLib-quartz | 基於Spring Boot Quartz開發的定時任務

基於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步、運行效果

10s後運行效果圖

API

名稱方法參數返回類型說明
開啓定時任務start(ScheduleBean)boolean開啓是否成功,true:成功,false:失敗
定時任務當前狀態status-boolean定時任務當前狀態,true:運行中,false:已停止
停止定時任務stop-boolean定時任務停止是否成功,true:成功,false:失敗

ScheduleBean字段說明

名稱參數類型說明
SchedulerschedulerSchedulerScheduler 對象
編號idLong-,保留字段
名稱nameString-,保留字段
描述descriptionString-,保留字段
選用類型timeTimeTimeTypeEnum選用構造Trigger對象類型
job類clazzClass定時任務執行的job類
job參數paramJobMapMap定時任務執行的job類
job類paramTriggerMapMap定時任務執行的job類
cron表達式cronStringcron表達式
時間間隔timeInteger每隔一段時間執行一次
時間間隔atTimeLong指定一個時間點執行(毫秒數)
Job名稱jobNameStringJob名稱
Job組jobGroupStringJob組名稱
TriggerNametriggerNameStringTrigger名稱
Trigger組triggerGroupStringTrigger組名稱

TimeTypeEnum

字段說明

字段類型說明
codeInteger代碼
msgString說明

值說明

名稱代碼說明
SIMPLE1簡單的定時任務,每隔一段時間執行一次
AT_TIME2指定一個時間點執行(毫秒數[Long])
CRON3使用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 自下而上進行覆蓋

資料

【1】 JavaLib-quartz 測試及使用示例代碼

【2】 JavaLib-quartz 源碼

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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章