日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot中使用Quartz管理定時任務的方法

瀏覽:22日期:2023-04-28 17:14:04

定時任務在系統中用到的地方很多,例如每晚凌晨的數據備份,每小時獲取第三方平臺的 Token 信息等等,之前我們都是在項目中規定這個定時任務什么時候啟動,到時間了便會自己啟動,那么我們想要停止這個定時任務的時候,就需要去改動代碼,還得啟停服務器,這是非常不友好的事情

直至遇見 Quartz,利用圖形界面可視化管理定時任務,使得我們對定時任務的管理更加方便,快捷

一、Quartz 簡介

Quartz是一個開源的作業調度框架,它完全由Java寫成,并設計用于J2SE和J2EE應用中。它提供了巨大的靈 活性而不犧牲簡單性。你能夠用它來為執行一個作業而創建簡單的或復雜的調度。它有很多特征,如:數據庫支持,集群,插件,EJB作業預構 建,JavaMail及其它,支持cron-like表達式等等。

二、開發前戲

1、引入 maven 依賴

<!-- web支持 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!-- Quartz 定時任務 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId></dependency>

這里引入了 web 的依賴,以及 Quartz 的依賴,其余依賴請根據需求自行引入

2、創建數據表

數據模型:

SpringBoot中使用Quartz管理定時任務的方法

SQL語句:

drop table if exists sys_quartz;/*==============================================================*//* Table: sys_quartz *//*==============================================================*/create table sys_quartz( id bigint(20) not null auto_increment comment ’主鍵id’, class_name varchar(32) comment ’任務類名’, cron_expression varchar(32) comment ’cron表達式’, param varchar(32) comment ’參數’, descript varchar(11) comment ’描述’, quartz_status varchar(255) comment ’啟動狀態(0--啟動1--停止)’, create_time datetime comment ’創建時間’, create_user bigint(20) comment ’創建人’, status tinyint(1) default 0 comment ’狀態(0--正常1--停用)’, del_flag tinyint(1) default 0 comment ’刪除狀態(0,正常,1已刪除)’, primary key (id))type = InnoDB;alter table sys_quartz comment ’定時任務信息表’;

三、開發進行中

1、創建實體類

import com.baomidou.mybatisplus.annotation.*;import com.baomidou.mybatisplus.extension.activerecord.Model;import com.zyxx.common.annotation.Dict;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.EqualsAndHashCode;import lombok.experimental.Accessors;import java.io.Serializable;/** * <p> * 定時任務信息表 * </p> * * @author lizhou * @since 2020-07-21 */@Data@EqualsAndHashCode(callSuper = false)@Accessors(chain = true)@TableName('sys_quartz')@ApiModel(value='SysQuartz對象', description='定時任務信息表')public class SysQuartz extends Model<SysQuartz> { @ApiModelProperty(value = '主鍵id') @TableId(value = 'id', type = IdType.AUTO) private Long id; @ApiModelProperty(value = '任務類名') @TableField('class_name') private String className; @ApiModelProperty(value = 'cron表達式') @TableField('cron_expression') private String cronExpression; @ApiModelProperty(value = '參數') @TableField('param') private String param; @ApiModelProperty(value = '描述') @TableField('descript') private String descript; @ApiModelProperty(value = '啟動狀態(0--啟動1--停止)') @TableField('quartz_status') private Integer quartzStatus; @ApiModelProperty(value = '狀態(0--正常1--停用)') @TableField('status') private Integer status; @ApiModelProperty(value = '刪除狀態(0--未刪除1--已刪除)') @TableField('del_flag') @TableLogic private Integer delFlag; @ApiModelProperty(value = '創建者') @TableField('create_user') private Long createUser; @ApiModelProperty(value = '創建時間') @TableField('create_time') private String createTime; @Override protected Serializable pkVal() { return this.id; }}

2、實現定時任務的 CRUD

下面我們就要完成定時任務的 新增、修改、刪除、啟停 等基本操作了,由于不是很復雜,這里的代碼就不貼出來了,貼幾張圖吧

列表頁:

SpringBoot中使用Quartz管理定時任務的方法

新增頁:

SpringBoot中使用Quartz管理定時任務的方法

四、定時任務

1、定時任務類

我們把定時任務都放在 job 包下面,一個定時任務就是一個文件,寫一個測試的類 TestJob.java

import com.zyxx.common.utils.DateUtils;import lombok.extern.slf4j.Slf4j;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;/** * @ClassName TestJob * 測試定時任務 * @Author Lizhou * @Date 2020-07-21 10:58:58 **/@Slf4jpublic class TestJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println('定時任務啟動:' + DateUtils.getYmdHms()); }}

TestJob 這個類實現了 Job 接口,實現了 execute 方法,這里還可以接收參數

這個文件在 com.zyxx.sbm.job 包下面,那么在頁面新增定時任務的時候,就需要填寫任務類名為:com.zyxx.sbm.job.TestJob

cron 表達式的知識這里就不一一介紹了

2、頁面添加定時任務

SpringBoot中使用Quartz管理定時任務的方法

那么我們的任務類名就是:com.zyxx.sbm.job.TestJobcron 表達式:*/2 * * * * ?,表示兩秒鐘執行一次參數:我們沒有傳入參數

3、后臺添加定時任務

package com.zyxx.sbm.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.zyxx.common.shiro.SingletonLoginUtils;import com.zyxx.common.utils.DateUtils;import com.zyxx.common.utils.LayTableResult;import com.zyxx.common.utils.ResponseResult;import com.zyxx.sbm.entity.SysQuartz;import com.zyxx.sbm.mapper.SysQuartzMapper;import com.zyxx.sbm.service.SysQuartzService;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.quartz.*;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * <p> * 定時任務信息表 服務實現類 * </p> * * @author lizhou * @since 2020-07-21 */@Slf4j@Servicepublic class SysQuartzServiceImpl extends ServiceImpl<SysQuartzMapper, SysQuartz> implements SysQuartzService { @Autowired private Scheduler scheduler;/*** 添加定時任務*/ @Override public ResponseResult add(SysQuartz sysQuartz) { QueryWrapper<SysQuartz> queryWrapper = new QueryWrapper<>(); queryWrapper.eq('class_name', sysQuartz.getClassName()); List<SysQuartz> sysQuartzList = list(queryWrapper); if (null != sysQuartzList && !sysQuartzList.isEmpty()) { return ResponseResult.getInstance().error('該任務類名已經存在'); } sysQuartz.setCreateTime(DateUtils.getYmdHms()); sysQuartz.setCreateUser(SingletonLoginUtils.getUserId()); save(sysQuartz); // 啟動 if (0 == sysQuartz.getQuartzStatus()) { this.schedulerAdd(sysQuartz.getClassName().trim(), sysQuartz.getCronExpression().trim(), sysQuartz.getParam()); } return ResponseResult.getInstance().success(); } /** * 添加定時任務 * * @param className * @param cronExpression * @param param */ @Override public void schedulerAdd(String className, String cronExpression, String param) { try { // 啟動調度器 scheduler.start(); // 構建job信息 JobDetail jobDetail = JobBuilder.newJob(getClass(className).getClass()).withIdentity(className).usingJobData('param', param).build(); // 表達式調度構建器(即任務執行的時間) CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); // 按新的cronExpression表達式構建一個新的trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(className).withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { log.error(e.getMessage()); } catch (RuntimeException e) { log.error(e.getMessage()); } catch (Exception e) { log.error(e.getMessage()); } } /** * 刪除定時任務 * * @param className */ @Override public void schedulerDelete(String className) { try { scheduler.pauseTrigger(TriggerKey.triggerKey(className)); scheduler.unscheduleJob(TriggerKey.triggerKey(className)); scheduler.deleteJob(JobKey.jobKey(className)); } catch (Exception e) { log.error(e.getMessage(), e); } } private static Job getClass(String className) throws Exception { Class<?> class1 = Class.forName(className); return (Job) class1.newInstance(); }}

需要注入 Scheduler 對象,使用該對象開啟或停止定時任務

在啟動定時任務之前,我們應先刪除該任務類名開啟的定時任務,防止該任務類名已經添加過了

// 刪除定時任務schedulerDelete(sysQuartz.getClassName().trim());// 添加定時任務schedulerAdd(sysQuartz.getClassName().trim(), sysQuartz.getCronExpression().trim(), sysQuartz.getParam());

添加定時任務,傳入任務類名,cron 表達式,參數

停止定時任務,只需要:

scheduler.pauseJob(JobKey.jobKey(sysQuartz.getClassName().trim()));

根據任務類名,停止定時任務即可

五、開發測試

啟動項目,在管理界面,開啟定時任務,即可在控制臺看到打印的信息

SpringBoot中使用Quartz管理定時任務的方法

表示我們的定時任務已經啟動成功了

六、優化建議

當我們添加了定時任務并啟動后,重新啟動項目的時候,定時任務卻不會自動啟動,這時候,我們就需要在項目啟動的時候做一些事情了,也就是系統啟動任務

不清楚的同學可以復習一下之前我的博客【SpringBoot】十九、SpringBoot中實現啟動任務

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.zyxx.sbm.entity.SysQuartz;import com.zyxx.sbm.service.SysQuartzService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;import java.util.List;/** * @ClassName SystemStartTask * 項目啟動任務--啟動定時任務 * @Author Lizhou * @Date 2020-07-21 12:56:56 **/@Component@Order(100)public class SystemQuartzStartTask implements CommandLineRunner { @Autowired private SysQuartzService sysQuartzService; @Override public void run(String... args) throws Exception { // 查詢啟動的定時任務 QueryWrapper<SysQuartz> queryWrapper = new QueryWrapper<>(); queryWrapper.eq('status', 0); queryWrapper.eq('quartz_status', 0); List<SysQuartz> list = sysQuartzService.list(queryWrapper); if (null != list && !list.isEmpty()) { for (SysQuartz item : list) { // 刪除定時任務 sysQuartzService.schedulerDelete(item.getClassName().trim()); // 添加定時任務 sysQuartzService.schedulerAdd(item.getClassName().trim(), item.getCronExpression().trim(), item.getParam()); } } }}

從數據庫查詢出啟動的定時任務,并將他們添加到定時任務啟動中,這樣項目一啟動時,就會自動啟動我們定義的定時任務了

最后

任務類名的正則表達式

/^[a-zA-Z]+(.([a-zA-Z])+)+$/

cron 表達式的驗證使用正則太麻煩,可以使用 Quartz 自帶驗證方法

CronExpression.isValidExpression(cron)

SpringBoot 中使用 Quartz 管理定時任務的學習就到這兒了,其實也并不難理解,相比于之前用的定時任務是不是好很多了呢,別忘了最后加上系統啟動任務哦

總結

到此這篇關于SpringBoot中使用Quartz管理定時任務的文章就介紹到這了,更多相關SpringBoot管理定時任務內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费亚洲一区| 青青草91视频| 欧美1区二区| 国产欧美一级| 久久国产三级精品| 国产免费av一区二区三区| 亚洲精品影视| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 午夜久久av| 亚洲色诱最新| 99综合视频| 人人精品人人爱| 日韩欧美久久| 国产精品久久免费视频| 国产福利一区二区精品秒拍 | 精品五月天堂| 岛国av在线网站| 日韩在线短视频| 色婷婷精品视频| 热三久草你在线| 亚洲韩日在线| 蜜臀91精品一区二区三区| 婷婷精品在线| 麻豆精品视频在线观看免费| 手机在线电影一区| 亚洲福利免费| 亚洲精品欧洲| 国产精品4hu.www| 成人羞羞视频在线看网址| 免费视频一区三区| 亚洲视频国产精品| 国产精品视频一区二区三区四蜜臂| 国产一区二区三区不卡视频网站 | 日韩精品三区四区| 美腿丝袜亚洲一区| 久久激情中文| 久久最新视频| 久久不卡日韩美女| 亚洲成人av观看| 免费久久99精品国产| 91九色综合| 激情综合五月| 精品一区在线| 青青草国产成人99久久| 国产精品13p| 亚洲免费网址| 欧美激情精品| 不卡在线一区| 国产精品视频一区视频二区| 精精国产xxxx视频在线野外 | 蜜桃久久av| 美女视频一区在线观看| 亚洲精品99| 国产毛片一区二区三区| 成人久久久久| 日本中文字幕不卡| 人人草在线视频| 日韩av中文字幕一区二区三区| 黄色在线观看www| 日韩精品一区二区三区av| 亚洲精品88| 97精品国产99久久久久久免费| 肉色欧美久久久久久久免费看| 亚洲在线久久| 中文字幕在线官网| 亚洲不卡视频| 欧美影院三区| 国产精品白丝一区二区三区| 激情久久久久久久| 国产精品xxx| 性欧美69xoxoxoxo| 国产在线观看91一区二区三区| 首页国产欧美日韩丝袜| 美女福利一区二区三区| 欧美日韩xxxx| 中文亚洲欧美| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 美女网站一区| 国产精品magnet| 人人精品人人爱| 丝袜美腿诱惑一区二区三区 | 麻豆成人综合网| 亚洲一区二区三区四区电影| 国模大尺度视频一区二区| 亚洲精品看片| 欧美1区2区3区| 麻豆91在线播放| 日韩精品免费视频人成| 欧美特黄视频| 国产麻豆久久| 精品国产成人| 日韩精品三区四区| 99在线|亚洲一区二区| av资源新版天堂在线| 国产精品亚洲综合在线观看| 自拍自偷一区二区三区| 好吊日精品视频| 欧美日韩精品免费观看视欧美高清免费大片| 欧美日韩亚洲一区三区| 免费视频一区二区| 国产精品日本| 午夜国产一区二区| 欧美日韩色图| 久久婷婷丁香| 日韩在线短视频| 91日韩欧美| 日本va欧美va瓶| 99热免费精品| 五月婷婷六月综合| 午夜精品成人av| 美女被久久久| 女主播福利一区| 免费污视频在线一区| 美女尤物国产一区| 国产精品久久国产愉拍| 欧美综合社区国产| 日韩国产在线观看一区| 亚洲精品免费观看| 亚洲va久久久噜噜噜久久| 亚洲一区二区三区无吗| 综合国产精品| 91精品尤物| 国产精品超碰| 成人高清一区| 六月婷婷综合| 伊人久久国产| 色老板在线视频一区二区| 91精品国产福利在线观看麻豆| sm久久捆绑调教精品一区| bbw在线视频| 91精品国产福利在线观看麻豆| 久久影院一区| 国产视频一区欧美| 一区二区不卡| 欧美视频久久| 精品网站999| 亚洲成人精品| 鲁大师影院一区二区三区| 蜜臀久久99精品久久久久久9| 亚洲精品乱码| 国产精品mv在线观看| 正在播放日韩精品| 欧美中文一区二区| 国产精品嫩草99av在线| 美女网站久久| 日韩欧美中文字幕在线视频| 久久国产麻豆精品| 国产精品久久| 日产精品一区| 丝袜美腿成人在线| 日韩欧美久久| 精品久久中文| 久久视频国产| 亚洲精品精选| 国产精品tv| 日韩一区亚洲二区| 99riav1国产精品视频| 亚久久调教视频| 久久xxx视频| 99久久夜色精品国产亚洲1000部| 五月天久久777| 欧美一区二区三区久久精品| 久久精品国产久精国产爱| 日韩在线看片| 日韩在线卡一卡二| 国产精品美女在线观看直播| 欧美国产美女| 美女精品在线| 另类综合日韩欧美亚洲| 久久久亚洲一区| 亚洲精品乱码| 色欧美自拍视频| 久久亚洲一区| 久久中文在线| 不卡在线一区| 国产精品免费不| 亚洲国产一区二区在线观看 | 7777精品| 久久九九99| 日韩av在线免费观看不卡| 国产成人精品999在线观看| 99pao成人国产永久免费视频| 国产精品久久久久久久免费软件| 久久一级电影| 国产精品亚洲欧美一级在线| 欧美精选一区二区三区| 久久国产麻豆精品| 另类中文字幕国产精品| 婷婷精品在线| 成人日韩在线观看| 日本va欧美va瓶| 欧美在线观看视频一区| 国产色99精品9i| 午夜欧美理论片| 久久精品一区二区三区中文字幕| 久久大逼视频| 日本精品不卡| 免费精品一区| 亚洲日本三级| 久久久久蜜桃|