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

基於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

10s後運行效果圖

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 說明

值說明app

名稱 代碼 說明
SIMPLE 1 簡單的定時任務,每隔一段時間執行一次
AT_TIME 2 指定一個時間點執行(毫秒數[Long])
CRON 3 使用cron表達式(時間點、循環、自定義時間)

wiki

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 自下而上進行覆蓋

資料

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

【2】 JavaLib-quartz 源碼

About Me

©author Wenyi Feng

Licensed

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.
相關文章
相關標籤/搜索