国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

重慶市工程建設信息網(wǎng)2021優(yōu)化關鍵詞的公司

重慶市工程建設信息網(wǎng)2021,優(yōu)化關鍵詞的公司,app開發(fā)制作網(wǎng)站平臺,什么網(wǎng)站可以用視頻做背景SpringBoot教程(二十四) | SpringBoot實現(xiàn)分布式定時任務之Quartz(動態(tài)新增、修改等操作) 前言數(shù)據(jù)庫腳本創(chuàng)建需要被調(diào)度的方法創(chuàng)建相關實體類創(chuàng)建業(yè)務層接口創(chuàng)建業(yè)務層實現(xiàn)類控制層類測試結(jié)果 前言 我這邊的SpringBoot的版本為2…

SpringBoot教程(二十四) | SpringBoot實現(xiàn)分布式定時任務之Quartz(動態(tài)新增、修改等操作)

  • 前言
  • 數(shù)據(jù)庫腳本
  • 創(chuàng)建需要被調(diào)度的方法
  • 創(chuàng)建相關實體類
  • 創(chuàng)建業(yè)務層接口
  • 創(chuàng)建業(yè)務層實現(xiàn)類
  • 控制層類
  • 測試結(jié)果

前言

我這邊的SpringBoot的版本為2.6.13,其中Quartz是使用的以下方式引入

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

數(shù)據(jù)庫腳本

首先確定maven拉取了 spring-boot-starter-quartz 的依賴,再接著到私倉下面找到
"你的私倉地址\org\quartz-scheduler\quartz\2.3.2"把這個下面的quartz-2.3.2.jar 給解壓
然后到這個文件的 “quartz-2.3.2\org\quartz\impl\jdbcjobstore” 下面就可以可以看到

在這里插入圖片描述
我這邊選擇的是“tables_mysql_innodb.sql”腳本
內(nèi)容如下,執(zhí)行以后會出現(xiàn)11張表

#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
#  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(190) NOT NULL,
JOB_GROUP VARCHAR(190) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
JOB_NAME VARCHAR(190) NOT NULL,
JOB_GROUP VARCHAR(190) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(190) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_SIMPROP_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(190) NOT NULL,TRIGGER_GROUP VARCHAR(190) NOT NULL,STR_PROP_1 VARCHAR(512) NULL,STR_PROP_2 VARCHAR(512) NULL,STR_PROP_3 VARCHAR(512) NULL,INT_PROP_1 INT NULL,INT_PROP_2 INT NULL,LONG_PROP_1 BIGINT NULL,LONG_PROP_2 BIGINT NULL,DEC_PROP_1 NUMERIC(13,4) NULL,DEC_PROP_2 NUMERIC(13,4) NULL,BOOL_PROP_1 VARCHAR(1) NULL,BOOL_PROP_2 VARCHAR(1) NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(190) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
ENGINE=InnoDB;CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;CREATE TABLE QRTZ_FIRED_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
INSTANCE_NAME VARCHAR(190) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(190) NULL,
JOB_GROUP VARCHAR(190) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
ENGINE=InnoDB;CREATE TABLE QRTZ_SCHEDULER_STATE (
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(190) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
ENGINE=InnoDB;CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
ENGINE=InnoDB;CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);commit;

在這里插入圖片描述

表的說明

表名稱說明
qrtz_blob_triggersblog類型存儲triggers
qrtz_calendars以blog類型存儲Calendar信息
qrtz_cron_triggers存儲cron trigger信息
qrtz_fired_triggers存儲已觸發(fā)的trigger相關信息
qrtz_job_details存儲每一個已配置的job details
qrtz_locks存儲悲觀鎖的信息
qrtz_paused_trigger_grps存儲已暫停的trigger組信息
qrtz_scheduler_state存儲Scheduler狀態(tài)信息
qrtz_simple_triggers存儲simple trigger信息
qrtz_simprop_triggers存儲其他幾種trigger信息
qrtz_triggers存儲已配置的trigger信息

創(chuàng)建需要被調(diào)度的方法

package com.example.springbootfull.quartztest;import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @DisallowConcurrentExecution : 此標記用在實現(xiàn)Job的類上面,意思是不允許并發(fā)執(zhí)行.* 因為Quartz的是并發(fā)操作的,要非常注意線程不安全,最好加上這個注解,以防止導致業(yè)務數(shù)據(jù)錯亂*/
@Slf4j
@DisallowConcurrentExecution
public class BookTask extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {JobDetail jobDetail = context.getJobDetail();log.info("book定時任務-開始執(zhí)行,"+ "任務名:" + jobDetail.getKey().getName()+ ",組名:" + jobDetail.getKey().getGroup()+ " "+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
//        try {
//            Thread.sleep(3000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }log.info("book定時任務-執(zhí)行結(jié)束,"+ "任務名:" + jobDetail.getKey().getName()+ ",組名:" + jobDetail.getKey().getGroup()+ " "+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));}
}

創(chuàng)建相關實體類

package com.example.springbootfull.quartztest.bean;import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;// 使用@Data注解自動為該類生成getter、setter、equals、hashCode和toString方法
@Data
public class QuartzBean {// 任務名稱private String jobName;// 任務組的名稱private String jobGroupName;// 任務的狀態(tài)(例如:運行中、已停止等)private String state;// 執(zhí)行任務的類名(通常是一個實現(xiàn)了Job接口的類的全限定名)private String jobClass;// 間隔單位(例如:秒、分鐘、小時等)private String intervalUnit;// 間隔單位的可讀名稱(例如:Seconds、Minutes、Hours等)private String intervalUnitName;// 時間間隔的數(shù)量(例如:如果intervalUnit是Minutes,這個值可能是5,表示每5分鐘執(zhí)行一次)private Integer timeInterval;// Cron表達式,用于更復雜的任務調(diào)度(例如:每天凌晨1點執(zhí)行)private String cronExpression;// 任務開始時間,使用@DateTimeFormat和@JsonFormat注解來指定日期格式和時區(qū)// @DateTimeFormat用于Spring MVC綁定表單數(shù)據(jù)時解析日期// @JsonFormat用于JSON序列化/反序列化時處理日期@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date startTime;// 任務結(jié)束時間,格式同上@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date endTime;// 任務的描述信息private String description;
}

創(chuàng)建業(yè)務層接口

package com.example.springbootfull.quartztest.service;import com.example.springbootfull.quartztest.bean.QuartzBean;
import com.example.springbootfull.quartztest.zdyresult.ResponseResult;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Service;import java.util.List;public interface IQuartzService {/*** 添加定時任務信息** @param quartzBean 定時任務信息*/void save(QuartzBean quartzBean);/*** 移除定時任務--根據(jù)任務名稱移除** @param jobName 任務名*/void delete(String jobName);/*** 移除定時任務** @param groupName 組名* @param jobName   任務名*/void delete(String jobName, String groupName);/*** 修改定時任務** @param quartzBean 任務信息*/void update(QuartzBean quartzBean);/*** 添加任務** @param jobName 任務名* @return 任務信息*/QuartzBean selectByName(String jobName);/*** 查詢單個定時任務信息** @param groupName 組名稱* @param jobName   任務名稱* @return 查詢結(jié)果*/QuartzBean selectByName(String jobName, String groupName);/*** 查詢定時任務列表** @param quartzBean 查詢條件* @return 查詢結(jié)果*/List<QuartzBean> selectList(QuartzBean quartzBean);/*** 暫停定時任務** @param jobName 任務名*/void pause(String jobName);/*** 暫停定時任務** @param jobName   任務名* @param groupName 組名*/void pause(String jobName, String groupName);/*** 恢復定時任務** @param jobName 任務名*/void resume(String jobName);/*** 恢復定時任務** @param jobName   任務名* @param groupName 組名*/void resume(String jobName, String groupName);/*** 執(zhí)行定時任務** @param jobName 任務名*/void executeJob(String jobName);/*** 執(zhí)行定時任務** @param jobName   任務名* @param groupName 組名*/void executeJob(String jobName, String groupName);
}

創(chuàng)建業(yè)務層實現(xiàn)類

package com.example.springbootfull.quartztest.serviceImpl;import com.example.springbootfull.quartztest.bean.QuartzBean;
import com.example.springbootfull.quartztest.service.IQuartzService;
import lombok.SneakyThrows;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.annotation.Resource;
import java.util.*;@Service
public class QuartzServiceImpl implements IQuartzService {@Resourceprivate Scheduler scheduler;/*** 保存一個 Quartz 作業(yè)到調(diào)度器中。** @param quartzBean 包含作業(yè)和觸發(fā)器配置信息的 QuartzBean 對象。* @throws SchedulerException     如果在調(diào)度作業(yè)或觸發(fā)器時發(fā)生錯誤。* @throws ClassNotFoundException 如果找不到指定的作業(yè)類。*/@Override@SneakyThrowspublic void save(QuartzBean quartzBean) {// 通過反射獲取作業(yè)類的 Class 對象Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(quartzBean.getJobClass());// 獲取作業(yè)名稱String jobName = quartzBean.getJobName();// 獲取作業(yè)組名稱,如果沒有指定則使用默認組String jobGroupName = !StringUtils.hasText(quartzBean.getJobGroupName()) ? Scheduler.DEFAULT_GROUP : quartzBean.getJobGroupName();// 獲取觸發(fā)器組名稱,通常與作業(yè)組名稱相同String triggerGroupName = !StringUtils.hasText(quartzBean.getJobGroupName()) ? Scheduler.DEFAULT_GROUP : quartzBean.getJobGroupName();// 獲取作業(yè)開始時間,如果沒有指定則使用當前時間Date startTime = quartzBean.getStartTime() == null ? new Date() : quartzBean.getStartTime();// 獲取作業(yè)結(jié)束時間Date endTime = quartzBean.getEndTime();// 獲取作業(yè)描述,如果沒有指定則使用空字符串String description = !StringUtils.hasText(quartzBean.getDescription()) ? "" : quartzBean.getDescription();// 構(gòu)建作業(yè)詳情對象JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName) // 設置作業(yè)名稱和組名稱.withDescription(description)        // 設置作業(yè)描述.build();// 檢查是否指定了 Cron 表達式if (quartzBean.getCronExpression() != null && quartzBean.getCronExpression().length() > 0) {// 如果指定了 Cron 表達式,則構(gòu)建基于 Cron 的觸發(fā)器Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, triggerGroupName) // 設置觸發(fā)器名稱和組名稱.startAt(startTime)                      // 設置觸發(fā)器開始時間.endAt(endTime)                          // 設置觸發(fā)器結(jié)束時間(可選).withSchedule(CronScheduleBuilder.cronSchedule(quartzBean.getCronExpression()).withMisfireHandlingInstructionDoNothing()) // 設置 Cron 計劃和誤觸發(fā)處理策略.build();// 將作業(yè)和觸發(fā)器添加到調(diào)度器中scheduler.scheduleJob(jobDetail, trigger);} else {// 如果沒有指定 Cron 表達式,則構(gòu)建基于日歷間隔的觸發(fā)器DateBuilder.IntervalUnit cycleUnit = DateBuilder.IntervalUnit.valueOf(quartzBean.getIntervalUnit());Integer timeInterval = quartzBean.getTimeInterval();Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, triggerGroupName) // 設置觸發(fā)器名稱和組名稱.startAt(startTime)                      // 設置觸發(fā)器開始時間.endAt(endTime)                          // 設置觸發(fā)器結(jié)束時間(可選).withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withInterval(timeInterval, cycleUnit) // 設置間隔計劃和單位.withMisfireHandlingInstructionDoNothing()) // 設置誤觸發(fā)處理策略.build();// 將作業(yè)和觸發(fā)器添加到調(diào)度器中scheduler.scheduleJob(jobDetail, trigger);}}/*** 移除定時任務--根據(jù)任務名稱移除*/@Overridepublic void delete(String jobName) {delete(jobName, Scheduler.DEFAULT_GROUP);}/*** 移除定時任務*/@Override@SneakyThrowspublic void delete(String jobName, String groupName) {groupName = !StringUtils.hasText(groupName) ? Scheduler.DEFAULT_GROUP : groupName;// 指定作業(yè)(Job)JobKey jobKey = new JobKey(jobName, groupName);// 指定觸發(fā)器TriggerKey triggerKey = new TriggerKey(jobName, groupName);// 使用scheduler對象暫停與指定TriggerKey相關聯(lián)的觸發(fā)器scheduler.pauseTrigger(triggerKey);// 使用scheduler對象暫停與指定JobKey相關聯(lián)的作業(yè)。scheduler.pauseJob(jobKey);// 移除觸發(fā)器scheduler.unscheduleJob(triggerKey);// 刪除任務scheduler.deleteJob(jobKey);}/*** 修改定時任務*/@Override@SneakyThrowspublic void update(QuartzBean quartzBean) {delete(quartzBean.getJobName());save(quartzBean);}/*** 查詢單個定時任務*/@Overridepublic QuartzBean selectByName(String jobName) {return selectByName(jobName, Scheduler.DEFAULT_GROUP);}/*** 查詢單個定時任務*/@Override@SneakyThrowspublic QuartzBean selectByName(String jobName, String groupName) {groupName = !StringUtils.hasText(groupName) ? Scheduler.DEFAULT_GROUP : groupName;QuartzBean quartzBean = new QuartzBean();JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = scheduler.getJobDetail(jobKey);quartzBean.setJobName(jobName);quartzBean.setJobGroupName(groupName);setJob(jobKey, quartzBean, jobDetail);return quartzBean;}/*** 查詢定時任務列表*/@Override@SneakyThrowspublic List<QuartzBean> selectList(QuartzBean quartzBean) {List<QuartzBean> quartzBeans = new ArrayList<>();GroupMatcher<JobKey> mathcher = GroupMatcher.anyJobGroup();String keyWord = quartzBean.getJobName();Set<JobKey> jobKeys = scheduler.getJobKeys(mathcher);if (jobKeys==null) {return new ArrayList<>();}for (JobKey jobKey : jobKeys) {if (StringUtils.hasText(keyWord) && !jobKey.getName().contains(keyWord)) {continue;}QuartzBean quartzBean2 = new QuartzBean();JobDetail jobDetail = scheduler.getJobDetail(jobKey);quartzBean2.setJobName(jobKey.getName());quartzBean2.setJobGroupName(jobKey.getGroup());List<? extends Trigger> triggers = setJob(jobKey, quartzBean2, jobDetail);quartzBean2.setState(scheduler.getTriggerState(triggers.get(0).getKey()).name());quartzBeans.add(quartzBean2);}return quartzBeans;}/*** 暫停定時任務*/@Overridepublic void pause(String jobName) {pause(jobName, Scheduler.DEFAULT_GROUP);}/*** 暫停定時任務*/@Override@SneakyThrowspublic void pause(String jobName, String groupName) {groupName = !StringUtils.hasText(groupName) ? Scheduler.DEFAULT_GROUP : groupName;TriggerKey triggerKey = new TriggerKey(jobName, groupName);scheduler.pauseTrigger(triggerKey);JobKey jobKey = new JobKey(jobName);scheduler.pauseJob(jobKey);}/*** 恢復定時任務*/@Overridepublic void resume(String jobName) {resume(jobName, Scheduler.DEFAULT_GROUP);}/*** 恢復定時任務*/@Override@SneakyThrowspublic void resume(String jobName, String groupName) {//檢查groupName是否有有效的文本內(nèi)容,沒有有效的則用默認的組名groupName = !StringUtils.hasText(groupName) ? Scheduler.DEFAULT_GROUP : groupName;TriggerKey triggerKey = new TriggerKey(jobName, groupName);scheduler.resumeTrigger(triggerKey);JobKey jobKey = new JobKey(jobName);scheduler.resumeJob(jobKey);}/*** 執(zhí)行定時任務*/@Overridepublic void executeJob(String jobName) {executeJob(jobName, Scheduler.DEFAULT_GROUP);}/*** 執(zhí)行定時任務*/@Override@SneakyThrowspublic void executeJob(String jobName, String groupName) {//檢查groupName是否有有效的文本內(nèi)容,沒有有效的則用默認的組名groupName = !StringUtils.hasText(groupName) ? Scheduler.DEFAULT_GROUP : groupName;JobKey jobKey = new JobKey(jobName, groupName);scheduler.triggerJob(jobKey);}/*** 根據(jù)提供的JobKey和JobDetail信息,設置QuartzBean的屬性,并返回與該作業(yè)關聯(lián)的觸發(fā)器列表。** @param jobKey      作業(yè)的唯一標識,包括作業(yè)名稱和作業(yè)組名。* @param quartzBean  用于封裝Quartz作業(yè)相關屬性的對象。* @param jobDetail   包含作業(yè)詳細信息的JobDetail對象。* @return 與指定作業(yè)關聯(lián)的觸發(fā)器列表,列表中的觸發(fā)器類型可能是CronTrigger或CalendarIntervalTrigger等。* @throws SchedulerException 如果在獲取觸發(fā)器列表時發(fā)生錯誤。*/private List<? extends Trigger> setJob(JobKey jobKey, QuartzBean quartzBean, JobDetail jobDetail) throws SchedulerException {// 設置作業(yè)類名和描述quartzBean.setJobClass(jobDetail.getJobClass().getName());quartzBean.setDescription(jobDetail.getDescription());// 嘗試獲取與指定作業(yè)關聯(lián)的觸發(fā)器列表List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);// 檢查觸發(fā)器列表是否為空或沒有元素if (triggers == null || triggers.isEmpty()) {// 根據(jù)業(yè)務需求,可以選擇拋出異常、返回空列表或進行其他處理// 這里為了簡化,直接返回空列表(注意:這可能會隱藏潛在的問題)return Collections.emptyList();}// 獲取第一個觸發(fā)器(注意:這里假設至少有一個觸發(fā)器)Trigger trigger = triggers.get(0);// 設置觸發(fā)器的開始時間和結(jié)束時間quartzBean.setStartTime(trigger.getStartTime());quartzBean.setEndTime(trigger.getEndTime());// 根據(jù)觸發(fā)器的具體類型設置相應的屬性if (trigger instanceof CronTrigger) {// 如果是CronTrigger類型,則獲取Cron表達式CronTrigger cronTrigger = (CronTrigger) trigger; // 使用instanceof后可以直接強制轉(zhuǎn)換,無需再次檢查類型quartzBean.setCronExpression(cronTrigger.getCronExpression());} else if (trigger instanceof CalendarIntervalTrigger) {// 如果是CalendarIntervalTrigger類型,則獲取重復間隔單位和重復間隔時間CalendarIntervalTrigger calendarIntervalTrigger = (CalendarIntervalTrigger) trigger;quartzBean.setIntervalUnit(calendarIntervalTrigger.getRepeatIntervalUnit().toString());quartzBean.setTimeInterval(calendarIntervalTrigger.getRepeatInterval());}// 注意:這里只處理了兩種類型的觸發(fā)器,如果有其他類型的觸發(fā)器,需要添加相應的處理邏輯// 返回與指定作業(yè)關聯(lián)的觸發(fā)器列表return triggers;}}

控制層類

package com.example.springbootfull.quartztest.controller;import com.example.springbootfull.quartztest.bean.QuartzBean;
import com.example.springbootfull.quartztest.service.IQuartzService;
import com.example.springbootfull.quartztest.zdyresult.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("taskScheduler")
public class QuartzController {@Autowiredprivate IQuartzService quartzService;/*** 添加定時任務信息** @param quartzBean 定時任務信息* @return ReturnModel 添加定時任務*/@PostMapping(value = "save")public ResponseResult<String> save(@RequestBody QuartzBean quartzBean) {
// {
//     "jobName": "bookTask",
//     "description": "書籍定時任務",
//     // "startTime": "2024-01-12 15:20:00",
//     // "endTime": "2024-01-13 00:00:00",
//     "jobClass": "com.example.springbootfull.quartztest.BookTask",
//     "cronExpression": "*/10 * * * * ?"
// }quartzService.save(quartzBean);return ResponseResult.success(quartzBean.getJobName());}/*** 移除定時任務** @param quartzBean 定時任務信息* @return ReturnModel 移除定時任務*/@PostMapping(value = "/delete")public ResponseResult<String> delete(@RequestBody QuartzBean quartzBean) {
//        {
//            "jobName": "bookTask"
//        }quartzService.delete(quartzBean.getJobName());return ResponseResult.success(quartzBean.getJobName());}/*** 修改定時任務** @param quartzBean 定時任務信息* @return ReturnModel 修改定時任務*/@PostMapping(value = "update")public ResponseResult<String> update(@RequestBody QuartzBean quartzBean) {
//        {
//            "jobName":"bookTask",
//                "description":"1",
//                "jobTypeRadio":"expression",
//                "startTime":"2024-01-13 14:00:00",
//                "endTime":"",
//                "jobClass":"com.example.demo.system.controller.BookTask",
//                "cronExpression":"*/30 * * * * ?"
//        }quartzService.update(quartzBean);return ResponseResult.success(quartzBean.getJobName());}/*** 暫停定時任務** @param quartzBean 定時任務名稱* @return ReturnModel 暫停定時任務*/@PostMapping(value = "pause")public ResponseResult<String> pause(@RequestBody QuartzBean quartzBean) {
//        {
//            "jobName": "bookTask2"
//        }quartzService.pause(quartzBean.getJobName());return ResponseResult.success(quartzBean.getJobName());}/*** 恢復定時任務** @param quartzBean 定時任務名稱* @return ReturnModel 恢復定時任務*/@PostMapping(value = "resume")public ResponseResult<String> resume(@RequestBody QuartzBean quartzBean) {
//        {
//            "jobName": "bookTask2"
//        }quartzService.resume(quartzBean.getJobName());return ResponseResult.success(quartzBean.getJobName());}/*** 執(zhí)行定時任務** @param quartzBean 定時任務名稱* @return ReturnModel 執(zhí)行定時任務*/@PostMapping(value = "executeJob")public ResponseResult<String> executeJob(@RequestBody QuartzBean quartzBean) {
//        {
//            "jobName": "bookTask2"
//        }quartzService.executeJob(quartzBean.getJobName());return ResponseResult.success(quartzBean.getJobName());}/*** 查詢單個定時任務信息** @param jobName 任務名稱* @return ReturnModel 查詢單個定時任務信息*/@GetMapping(value = "selectByName")public ResponseResult<QuartzBean> selectByName(@RequestParam("jobName") String jobName) {QuartzBean quartzBean = quartzService.selectByName(jobName);return ResponseResult.success(quartzBean);}/*** 查詢定時任務列表** @param quartzBean 查詢條件* @return ReturnModel 查詢定時任務列表*/@PostMapping(value = "selectList")public ResponseResult<List<QuartzBean>> selectList(@RequestBody QuartzBean quartzBean) {
//        {
//            "jobName": ""
//        }List<QuartzBean> quartzBeans = quartzService.selectList(quartzBean);return ResponseResult.success(quartzBeans);}
}

測試結(jié)果

我這邊只測試一下查看
在這里插入圖片描述

參考文章
【1】【QUARTZ】springboot+quartz動態(tài)配置定時任務

http://m.aloenet.com.cn/news/39446.html

相關文章:

  • 哈爾濱地鐵愛建站seo查詢網(wǎng)站是什么
  • 企業(yè)網(wǎng)站優(yōu)化找哪家搜索排行
  • wordpress本地建站成人零基礎學電腦培訓班
  • 瀚欽科技網(wǎng)站建設谷歌搜索引擎免費
  • 北京建站設計寫一篇軟文1000字
  • 有沒有專門做航拍婚禮網(wǎng)站應用下載app排行榜
  • wordpress動漫博客模板東莞seo靠譜
  • 網(wǎng)頁制作基礎教程第二版seo查詢 站長之家
  • 信譽好的東莞網(wǎng)站建設網(wǎng)站收錄查詢代碼
  • 做網(wǎng)站制作的摘要網(wǎng)店推廣策劃書
  • 視頻鏈接生成網(wǎng)站國通快速建站
  • 什么類型的產(chǎn)品可以做網(wǎng)站出口贛州seo外包
  • 國內(nèi)適合個人做外貿(mào)的網(wǎng)站有哪些app001推廣平臺官網(wǎng)
  • 寧夏干部網(wǎng)絡教育培訓學院小紅書seo排名優(yōu)化
  • 公司網(wǎng)站最新版今日剛剛發(fā)生新聞事件
  • 平面設計平臺接單win10最強性能優(yōu)化設置
  • 建設一個網(wǎng)站需要哪些材料合肥seo排名公司
  • 網(wǎng)站免費下載軟件游戲推廣怎么做
  • 門戶網(wǎng)站開發(fā)框架qq群怎么優(yōu)化排名靠前
  • 用bootstrap做網(wǎng)站管理系統(tǒng)優(yōu)秀網(wǎng)站設計賞析
  • 平面設計如何在家接單seo網(wǎng)絡優(yōu)化培訓
  • 設計網(wǎng)站 常用字體百度推廣怎么聯(lián)系
  • 有阿里云主機管理平臺如何自己做網(wǎng)站市場監(jiān)督管理局是干什么的
  • 正能量軟件不良網(wǎng)站免費入口好看的友情鏈接代碼
  • 網(wǎng)站商城建站谷歌 翻墻入口
  • qq自動發(fā)貨平臺網(wǎng)站怎么做嘉定區(qū)整站seo十大排名
  • app設計素材網(wǎng)站2023新聞大事10條
  • 中英文雙語企業(yè)網(wǎng)站長春關鍵詞優(yōu)化平臺
  • 聊城陽谷網(wǎng)站建設百度官網(wǎng)優(yōu)化
  • 小程序個人開發(fā)全過程天津seo推廣