1. 程式人生 > >JavaLib-quartz | 基於Spring Boot Quartz開發的定時任務

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

名稱 引數 型別 說明
Scheduler scheduler Scheduler Scheduler 物件
編號 id Long -,保留欄位
名稱 name String -,保留欄位
描述 description String -,保留欄位
選用型別 timeTime TimeTypeEnum 選用構造Trigger物件型別
job類 clazz Class 定時任務執行的job類
job引數 paramJobMap Map

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]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.

相關推薦

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

基於Spring Boot Quartz開發的JavaLib-quartz,目的是幫你快速構建定時任務系統,你可以專心編寫你的業務邏輯,而不必關注定時任務具體是如何實現的,他的效能如何,有沒有異常以及異常處理,監控等等問題。這些你可以在文件中得知。 快速使

Spring Boot筆記之定時任務Quartz

摘要 Spring Boot2.x支援spring-boot-starter-quartz,本文介紹spring-boot-starter-quartz配置及使用。 pom引入 <dependency> <groupId>org.springframew

基於spring boot 獨立開發的一套統一認證解決方案,易讀、易拓展

follow 公司 登錄頁面 跳轉 所有 不可 權限 github 源碼 公司需求搭建公司內部系統,需要使用到統一認證,在查看shiro等發現接入無頭緒,而且存在不可控性,對於認證系統高可用、可靠性會顯得無比重要,所以筆者決定手動擼一套統一認證解決方案。 筆者通過sprin

Spring Boot 中配置定時任務,實現多線程操作

pre log pri http code china 部分 多線程操作 .net 參考的代碼部分 https://git.oschina.net/jokerForTao/spring_boot_schedule 一目了然!Spring Boot 中配置定時任務,實現

spring boot 學習(八)定時任務 @Scheduled

gap 前言 ron mas 時區 class html run 手動 SpringBoot 定時任務 @Scheduled 前言 有時候,我們有這樣的需求,需要在每天的某個固定時間或者每隔一段時間讓應用去執行某一個任務。一般情況下,可以使用多線程來實現這個功能;在 Spr

使用spring-boot創建定時任務。同時創建多線程執行定時任務

from vnr thread make oca 工程 遷移 prefix gist 1,下載spring-boot的maven工程:http://start.spring.io/ 直接自定義工程名稱。 2 , 啟動類增加註解:@EnableScheduling 具體的業

spring boot系列4-定時任務-springboot自帶的scheduled超級簡單

需求:建立一個每天凌晨0點執行的定時任務 1.建立任務 /** * @author 天空藍藍的 */ @Slf4j @EnableScheduling @Component public class MyTask { @Async @Scheduled(cron = "0

Spring Boot整合之定時任務

@Scheduled適用與監聽任務較少的,而Quartz適合較多的,為確保可伸縮性,Quartz採用了基於多執行緒的架構。啟動時,框架初始化一套worker執行緒,這套執行緒被排程器用來執行預定的作業。這就是Quartz怎樣能併發執行多個作業的原理。Quartz依賴一套鬆耦合的執行緒池管理部件來管理

Spring Boot 整合之定時任務

前言 @Scheduled適用與監聽任務較少的,而Quartz適合較多的,為確保可伸縮性,Quartz採用了基於多執行緒的架構。啟動時,框架初始化一套worker執行緒,這套執行緒被排程器用來執行預定的作業。這就是Quartz怎樣能併發執行多個作業的原理。Quartz依賴一套鬆耦合的執行緒池

spring boot中得定時任務執行一段時間後突然停了 排查過程

在spring boot 專案中設定了一些定時任務,前幾天還執行得好好的,突然有一天就不再執行了,基本上呢都是執行了四天左右,定時任務停掉不在運行了,然後重啟程式定時任務就好使了,出現這麼兩次,第三次是在重啟以後第三天出現定時任務不再執行。感覺莫名其妙,查了好多資料,以下是關於我查到的關於定時任

spring boot —— 整合Scheduling定時任務

Spring 3.0後提供Spring Task實現任務排程,支援按日曆排程,相比Quartz功能稍簡單,但是在開發基本夠用,支 持註解程式設計方式。 序列任務 兩個任務方法由一個執行緒序列執行,方法執行完成task2再執行。  1 在spring boot 啟動類上添加註解:

spring boot中使用定時任務

1.在主類上新增EnableScheduling註解   package com.laoxu.gamedog; import org.springframework.boot.SpringApplication; import org.springframework.boot

Spring Boot 與 Kotlin 定時任務(Scheduling Tasks)

在編寫Spring Boot應用中會遇到這樣的場景,比如:需要定時地傳送一些簡訊、郵件之類的操作,也可能會定時地檢查和監控一些標誌、引數等。 建立定時任務 在Spring Boot中編寫定時任務是非常簡單的事,下面通過例項介紹如何在Spring Boot

spring boot 中配置定時任務job

我的文章中有關於spring mvc中 定時任務的配置:https://blog.csdn.net/T2080305/article/details/81626088。這裡有詳細講解如何配置,那麼spring boot中如何配置呢,spring boot講究無xml配置,也就

spring+struts+quartz開發定時任務出現的問題

java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker'

java spring-mvc spring-boot quartz定時

1.java中定時任務類。java.util.Timer  java.util.TimerTask package com.jiayun.demo; import java.util.Timer; import java.util.TimerTask; public c

Spring-boot整合Quartz,3、動態配置定時任務

通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業 首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。 設定JobDetail的名字和組

spring boot + quartz定時任務框架入坑指南

quartz Quartz是一個功能豐富的開源作業排程庫,可以整合到幾乎任何Java應用程式中 新增Maven依賴 <!-- druid阿里巴巴資料庫連線池 --> <dependency&

Spring boot + Quartz實現分散式定時任務

在實際專案中經常會用到定時任務,且有些定時任務同時只能執行一個例項,下面介紹一下通過Spring boot + Quartz框架實現分散式定時任務。 1. 定時任務持久化到Mysql 2. 名稱為JobA的定時任務每10秒執行一次@ScheduledJo

QuartzSpring Boot集成使用

ack innodb edr iba sta hid support getprop eat 上次自己搭建Quartz已經是幾年前的事了,這次項目中需要定時任務,需要支持集群部署,想到比較輕量級的定時任務框架就是Quartz,於是來一波。 版本說明 通過搜索引擎很容易找到其