From e8fc0b015d3c23f31ee22b0d76853a1417f54e84 Mon Sep 17 00:00:00 2001 From: xyiege Date: Fri, 15 Jul 2022 19:53:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +- note.md | 183 ++++++++++++- pom.xml | 12 +- .../java/cn/chjyj/szwh/bean/CronTrigger.java | 23 ++ .../cn/chjyj/szwh/bean/CronTriggerKey.java | 33 +++ .../cn/chjyj/szwh/bean/JobAndTrigger.java | 130 +++++++++ .../java/cn/chjyj/szwh/bean/JobDetail.java | 73 +++++ .../java/cn/chjyj/szwh/bean/JobDetailKey.java | 33 +++ src/main/java/cn/chjyj/szwh/bean/Trigger.java | 133 ++++++++++ .../java/cn/chjyj/szwh/bean/TriggerKey.java | 33 +++ .../cn/chjyj/szwh/configure/QuartzConfig.java | 59 +++++ .../szwh/controller/QuartzController.java | 176 +++++++++++++ .../cn/chjyj/szwh/dto/JobAndTriggerDto.java | 100 +++++++ src/main/java/cn/chjyj/szwh/job/HelloJob.java | 29 ++ .../chjyj/szwh/mapper/CronTriggerMapper.java | 18 ++ .../cn/chjyj/szwh/mapper/JobDetailMapper.java | 28 ++ .../cn/chjyj/szwh/mapper/TriggerMapper.java | 20 ++ .../cn/chjyj/szwh/service/QuartzService.java | 24 ++ .../szwh/service/impl/OrderServiceImpl.java | 1 + .../szwh/service/impl/QuartzServiceImpl.java | 98 +++++++ src/main/resources/application.properties | 11 +- .../mapper/szwh/CronTriggerMapper.xml | 93 +++++++ .../resources/mapper/szwh/JobDetailMapper.xml | 194 ++++++++++++++ .../resources/mapper/szwh/TriggerMapper.xml | 249 ++++++++++++++++++ src/main/resources/quartz.properties | 53 ++++ szwh.iml | 7 +- 26 files changed, 1812 insertions(+), 11 deletions(-) create mode 100644 src/main/java/cn/chjyj/szwh/bean/CronTrigger.java create mode 100644 src/main/java/cn/chjyj/szwh/bean/CronTriggerKey.java create mode 100644 src/main/java/cn/chjyj/szwh/bean/JobAndTrigger.java create mode 100644 src/main/java/cn/chjyj/szwh/bean/JobDetail.java create mode 100644 src/main/java/cn/chjyj/szwh/bean/JobDetailKey.java create mode 100644 src/main/java/cn/chjyj/szwh/bean/Trigger.java create mode 100644 src/main/java/cn/chjyj/szwh/bean/TriggerKey.java create mode 100644 src/main/java/cn/chjyj/szwh/configure/QuartzConfig.java create mode 100644 src/main/java/cn/chjyj/szwh/controller/QuartzController.java create mode 100644 src/main/java/cn/chjyj/szwh/dto/JobAndTriggerDto.java create mode 100644 src/main/java/cn/chjyj/szwh/job/HelloJob.java create mode 100644 src/main/java/cn/chjyj/szwh/mapper/CronTriggerMapper.java create mode 100644 src/main/java/cn/chjyj/szwh/mapper/JobDetailMapper.java create mode 100644 src/main/java/cn/chjyj/szwh/mapper/TriggerMapper.java create mode 100644 src/main/java/cn/chjyj/szwh/service/QuartzService.java create mode 100644 src/main/java/cn/chjyj/szwh/service/impl/QuartzServiceImpl.java create mode 100644 src/main/resources/mapper/szwh/CronTriggerMapper.xml create mode 100644 src/main/resources/mapper/szwh/JobDetailMapper.xml create mode 100644 src/main/resources/mapper/szwh/TriggerMapper.xml create mode 100644 src/main/resources/quartz.properties diff --git a/README.md b/README.md index d421248..c40f890 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,12 @@ eyJhbGciOiJIUzUxMiJ9.eyJhdWQiOiJCRDg0REQ0MkE3MjM0QjA1QjBDNUQxMTYxNjEzMkFDNCIsImp 12 [git 拉取指定的远程分支(三种方式](https://blog.csdn.net/duobaohongtu3/article/details/123572094) -13 [springBoot 获取请求头header里面的信息方式](https://www.pudn.com/news/62905fefbf399b7f352590db.html) \ No newline at end of file +13 [springBoot 获取请求头header里面的信息方式](https://www.pudn.com/news/62905fefbf399b7f352590db.html) + +14、[SpringBoot+Quartz动态管理定时任务](https://blog.csdn.net/xy294636185/article/details/123951509) + +15、[SpringBoot搭配Quartz实现动态定时任务](https://blog.csdn.net/wl_Honest/article/details/122176062) + +16、[SpringBoot整合Quartz](https://blog.csdn.net/weixin_38192427/article/details/121111677) + +17、[Springboot整合Quartz实现动态定时任务](https://segmentfault.com/a/1190000016554033) \ No newline at end of file diff --git a/note.md b/note.md index 07ad0c1..e65b028 100644 --- a/note.md +++ b/note.md @@ -14,4 +14,185 @@ 支付回调地址:http://116.77.235.153:8989/api/Pay/payCallback -渠道isli关联编码:999998-000000001920-2 \ No newline at end of file +渠道isli关联编码:999998-000000001920-2 + +# 定时人物 sql +# +# 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(200) NOT NULL, +JOB_GROUP VARCHAR(200) 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(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +JOB_NAME VARCHAR(200) NOT NULL, +JOB_GROUP VARCHAR(200) 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(200) 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(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) 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(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) 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(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) 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(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) 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(200) 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(200) 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(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +INSTANCE_NAME VARCHAR(200) 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(200) NULL, +JOB_GROUP VARCHAR(200) 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(200) 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; \ No newline at end of file diff --git a/pom.xml b/pom.xml index b996971..542bfab 100644 --- a/pom.xml +++ b/pom.xml @@ -109,12 +109,6 @@ 4.5.9 - - - - - - com.auth0 @@ -122,6 +116,12 @@ 3.8.3 + + + org.springframework.boot + spring-boot-starter-quartz + + diff --git a/src/main/java/cn/chjyj/szwh/bean/CronTrigger.java b/src/main/java/cn/chjyj/szwh/bean/CronTrigger.java new file mode 100644 index 0000000..a152326 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/CronTrigger.java @@ -0,0 +1,23 @@ +package cn.chjyj.szwh.bean; + +public class CronTrigger extends CronTriggerKey { + private String cronExpression; + + private String timeZoneId; + + public String getCronExpression() { + return cronExpression; + } + + public void setCronExpression(String cronExpression) { + this.cronExpression = cronExpression == null ? null : cronExpression.trim(); + } + + public String getTimeZoneId() { + return timeZoneId; + } + + public void setTimeZoneId(String timeZoneId) { + this.timeZoneId = timeZoneId == null ? null : timeZoneId.trim(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/bean/CronTriggerKey.java b/src/main/java/cn/chjyj/szwh/bean/CronTriggerKey.java new file mode 100644 index 0000000..222991f --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/CronTriggerKey.java @@ -0,0 +1,33 @@ +package cn.chjyj.szwh.bean; + +public class CronTriggerKey { + private String schedName; + + private String triggerName; + + private String triggerGroup; + + public String getSchedName() { + return schedName; + } + + public void setSchedName(String schedName) { + this.schedName = schedName == null ? null : schedName.trim(); + } + + public String getTriggerName() { + return triggerName; + } + + public void setTriggerName(String triggerName) { + this.triggerName = triggerName == null ? null : triggerName.trim(); + } + + public String getTriggerGroup() { + return triggerGroup; + } + + public void setTriggerGroup(String triggerGroup) { + this.triggerGroup = triggerGroup == null ? null : triggerGroup.trim(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/bean/JobAndTrigger.java b/src/main/java/cn/chjyj/szwh/bean/JobAndTrigger.java new file mode 100644 index 0000000..2ab9ad7 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/JobAndTrigger.java @@ -0,0 +1,130 @@ +package cn.chjyj.szwh.bean; + +import java.math.BigInteger; + +/** + * Quartz 定时bean + */ + +public class JobAndTrigger { + /** + * 定时任务名称 + */ + private String jobName; + /** + * 定时任务组 + */ + private String jobGroup; + /** + * 定时任务全类名 + */ + private String jobClassName; + /** + * 触发器名称 + */ + private String triggerName; + /** + * 触发器组 + */ + private String triggerGroup; + /** + * 重复间隔 + */ + private BigInteger repeatInterval; + /** + * 触发次数 + */ + private BigInteger timesTriggered; + /** + * cron 表达式 + */ + private String cronExpression; + /** + * 时区 + */ + private String timeZoneId; + /** + * 定时任务状态 + */ + private String triggerState; + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName; + } + + public String getJobGroup() { + return jobGroup; + } + + public void setJobGroup(String jobGroup) { + this.jobGroup = jobGroup; + } + + public String getJobClassName() { + return jobClassName; + } + + public void setJobClassName(String jobClassName) { + this.jobClassName = jobClassName; + } + + public String getTriggerName() { + return triggerName; + } + + public void setTriggerName(String triggerName) { + this.triggerName = triggerName; + } + + public String getTriggerGroup() { + return triggerGroup; + } + + public void setTriggerGroup(String triggerGroup) { + this.triggerGroup = triggerGroup; + } + + public BigInteger getRepeatInterval() { + return repeatInterval; + } + + public void setRepeatInterval(BigInteger repeatInterval) { + this.repeatInterval = repeatInterval; + } + + public BigInteger getTimesTriggered() { + return timesTriggered; + } + + public void setTimesTriggered(BigInteger timesTriggered) { + this.timesTriggered = timesTriggered; + } + + public String getCronExpression() { + return cronExpression; + } + + public void setCronExpression(String cronExpression) { + this.cronExpression = cronExpression; + } + + public String getTimeZoneId() { + return timeZoneId; + } + + public void setTimeZoneId(String timeZoneId) { + this.timeZoneId = timeZoneId; + } + + public String getTriggerState() { + return triggerState; + } + + public void setTriggerState(String triggerState) { + this.triggerState = triggerState; + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/bean/JobDetail.java b/src/main/java/cn/chjyj/szwh/bean/JobDetail.java new file mode 100644 index 0000000..6c85e89 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/JobDetail.java @@ -0,0 +1,73 @@ +package cn.chjyj.szwh.bean; + +public class JobDetail extends JobDetailKey { + private String description; + + private String jobClassName; + + private String isDurable; + + private String isNonconcurrent; + + private String isUpdateData; + + private String requestsRecovery; + + private byte[] jobData; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : description.trim(); + } + + public String getJobClassName() { + return jobClassName; + } + + public void setJobClassName(String jobClassName) { + this.jobClassName = jobClassName == null ? null : jobClassName.trim(); + } + + public String getIsDurable() { + return isDurable; + } + + public void setIsDurable(String isDurable) { + this.isDurable = isDurable == null ? null : isDurable.trim(); + } + + public String getIsNonconcurrent() { + return isNonconcurrent; + } + + public void setIsNonconcurrent(String isNonconcurrent) { + this.isNonconcurrent = isNonconcurrent == null ? null : isNonconcurrent.trim(); + } + + public String getIsUpdateData() { + return isUpdateData; + } + + public void setIsUpdateData(String isUpdateData) { + this.isUpdateData = isUpdateData == null ? null : isUpdateData.trim(); + } + + public String getRequestsRecovery() { + return requestsRecovery; + } + + public void setRequestsRecovery(String requestsRecovery) { + this.requestsRecovery = requestsRecovery == null ? null : requestsRecovery.trim(); + } + + public byte[] getJobData() { + return jobData; + } + + public void setJobData(byte[] jobData) { + this.jobData = jobData; + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/bean/JobDetailKey.java b/src/main/java/cn/chjyj/szwh/bean/JobDetailKey.java new file mode 100644 index 0000000..688684b --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/JobDetailKey.java @@ -0,0 +1,33 @@ +package cn.chjyj.szwh.bean; + +public class JobDetailKey { + private String schedName; + + private String jobName; + + private String jobGroup; + + public String getSchedName() { + return schedName; + } + + public void setSchedName(String schedName) { + this.schedName = schedName == null ? null : schedName.trim(); + } + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName == null ? null : jobName.trim(); + } + + public String getJobGroup() { + return jobGroup; + } + + public void setJobGroup(String jobGroup) { + this.jobGroup = jobGroup == null ? null : jobGroup.trim(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/bean/Trigger.java b/src/main/java/cn/chjyj/szwh/bean/Trigger.java new file mode 100644 index 0000000..a9a0da6 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/Trigger.java @@ -0,0 +1,133 @@ +package cn.chjyj.szwh.bean; + +public class Trigger extends TriggerKey { + private String jobName; + + private String jobGroup; + + private String description; + + private Long nextFireTime; + + private Long prevFireTime; + + private Integer priority; + + private String triggerState; + + private String triggerType; + + private Long startTime; + + private Long endTime; + + private String calendarName; + + private Short misfireInstr; + + private byte[] jobData; + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName == null ? null : jobName.trim(); + } + + public String getJobGroup() { + return jobGroup; + } + + public void setJobGroup(String jobGroup) { + this.jobGroup = jobGroup == null ? null : jobGroup.trim(); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : description.trim(); + } + + public Long getNextFireTime() { + return nextFireTime; + } + + public void setNextFireTime(Long nextFireTime) { + this.nextFireTime = nextFireTime; + } + + public Long getPrevFireTime() { + return prevFireTime; + } + + public void setPrevFireTime(Long prevFireTime) { + this.prevFireTime = prevFireTime; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public String getTriggerState() { + return triggerState; + } + + public void setTriggerState(String triggerState) { + this.triggerState = triggerState == null ? null : triggerState.trim(); + } + + public String getTriggerType() { + return triggerType; + } + + public void setTriggerType(String triggerType) { + this.triggerType = triggerType == null ? null : triggerType.trim(); + } + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + + public String getCalendarName() { + return calendarName; + } + + public void setCalendarName(String calendarName) { + this.calendarName = calendarName == null ? null : calendarName.trim(); + } + + public Short getMisfireInstr() { + return misfireInstr; + } + + public void setMisfireInstr(Short misfireInstr) { + this.misfireInstr = misfireInstr; + } + + public byte[] getJobData() { + return jobData; + } + + public void setJobData(byte[] jobData) { + this.jobData = jobData; + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/bean/TriggerKey.java b/src/main/java/cn/chjyj/szwh/bean/TriggerKey.java new file mode 100644 index 0000000..5beb8c6 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/bean/TriggerKey.java @@ -0,0 +1,33 @@ +package cn.chjyj.szwh.bean; + +public class TriggerKey { + private String schedName; + + private String triggerName; + + private String triggerGroup; + + public String getSchedName() { + return schedName; + } + + public void setSchedName(String schedName) { + this.schedName = schedName == null ? null : schedName.trim(); + } + + public String getTriggerName() { + return triggerName; + } + + public void setTriggerName(String triggerName) { + this.triggerName = triggerName == null ? null : triggerName.trim(); + } + + public String getTriggerGroup() { + return triggerGroup; + } + + public void setTriggerGroup(String triggerGroup) { + this.triggerGroup = triggerGroup == null ? null : triggerGroup.trim(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/configure/QuartzConfig.java b/src/main/java/cn/chjyj/szwh/configure/QuartzConfig.java new file mode 100644 index 0000000..7fb7573 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/configure/QuartzConfig.java @@ -0,0 +1,59 @@ +package cn.chjyj.szwh.configure; + +import org.quartz.Scheduler; +import org.quartz.ee.servlet.QuartzInitializerListener; +import org.springframework.beans.factory.config.PropertiesFactoryBean; +import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import java.io.IOException; +import java.util.Properties; + +/** + * @Author: CJ + * @Date: 2021-11-1 19:34 + */ +@Configuration +public class QuartzConfig implements SchedulerFactoryBeanCustomizer { + + @Bean + public Properties properties() throws IOException { + PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); + // 对quartz.properties文件进行读取 + propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties")); + // 在quartz.properties中的属性被读取并注入后再初始化对象 + propertiesFactoryBean.afterPropertiesSet(); + return propertiesFactoryBean.getObject(); + } + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() throws IOException { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setQuartzProperties(properties()); + return schedulerFactoryBean; + } + + /* + * quartz初始化监听器 + */ + @Bean + public QuartzInitializerListener executorListener() { + return new QuartzInitializerListener(); + } + + /* + * 通过SchedulerFactoryBean获取Scheduler的实例 + */ + @Bean + public Scheduler scheduler() throws IOException { + return schedulerFactoryBean().getScheduler(); + } + + @Override + public void customize(SchedulerFactoryBean schedulerFactoryBean) { + + } +} diff --git a/src/main/java/cn/chjyj/szwh/controller/QuartzController.java b/src/main/java/cn/chjyj/szwh/controller/QuartzController.java new file mode 100644 index 0000000..635e51d --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/controller/QuartzController.java @@ -0,0 +1,176 @@ +package cn.chjyj.szwh.controller; + +import cn.chjyj.szwh.dto.JobAndTriggerDto; +import cn.chjyj.szwh.service.QuartzService; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.HashMap; +import java.util.Map; + +import org.quartz.SchedulerException; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + + +/** + * @Author: CJ + * @Date: 2021-11-2 11:41 + */ +@RestController +@RequestMapping(path = "/quartz") +public class QuartzController { + + @Autowired + private QuartzService quartzService; + + /** + * 新增定时任务 + * + * @param jName 任务名称 + * @param jGroup 任务组 + * @param tName 触发器名称 + * @param tGroup 触发器组 + * @param cron cron表达式 + * @return ResultMap + */ + @PostMapping(path = "/addjob") + @ResponseBody + public JSONObject addjob(String jName, String jGroup, String tName, String tGroup, String cron) { + JSONObject jsonObject = new JSONObject(); + try { + quartzService.addjob(jName, jGroup, tName, tGroup, cron); + jsonObject.put("code",200); + jsonObject.put("msg","添加任务成功"); + } catch (Exception e) { + e.printStackTrace(); + jsonObject.put("code",400); + jsonObject.put("msg","添加任务失败"); + } + return jsonObject; + } + + /** + * 暂停任务 + * + * @param jName 任务名称 + * @param jGroup 任务组 + * @return ResultMap + */ + @PostMapping(path = "/pausejob") + @ResponseBody + public JSONObject pausejob(String jName, String jGroup) { + JSONObject jsonObject = new JSONObject(); + try { + quartzService.pausejob(jName, jGroup); + jsonObject.put("code",200); + jsonObject.put("msg","暂停任务成功"); + } catch (SchedulerException e) { + e.printStackTrace(); + jsonObject.put("code",200); + jsonObject.put("msg","暂停任务失败"); + } + return jsonObject; + } + + /** + * 恢复任务 + * + * @param jName 任务名称 + * @param jGroup 任务组 + * @return ResultMap + */ + @PostMapping(path = "/resumejob") + @ResponseBody + public JSONObject resumejob(String jName, String jGroup) { + JSONObject jsonObject = new JSONObject(); + try { + quartzService.resumejob(jName, jGroup); + jsonObject.put("code",200); + jsonObject.put("msg","恢复任务成功"); + } catch (SchedulerException e) { + e.printStackTrace(); + jsonObject.put("code",400); + jsonObject.put("msg","恢复任务失败"); + } + return jsonObject; + } + + /** + * 重启任务 + * + * @param jName 任务名称 + * @param jGroup 任务组 + * @param cron cron表达式 + * @return ResultMap + */ + @PostMapping(path = "/reschedulejob") + @ResponseBody + public JSONObject rescheduleJob(String jName, String jGroup, String cron) { + JSONObject jsonObject =new JSONObject(); + try { + quartzService.rescheduleJob(jName, jGroup, cron); + jsonObject.put("code",200); + jsonObject.put("msg","重启任务成功"); + } catch (SchedulerException e) { + e.printStackTrace(); + jsonObject.put("code",400); + jsonObject.put("msg","重启任务失败"); + } + return jsonObject; + } + + /** + * 删除任务 + * + * @param jName 任务名称 + * @param jGroup 任务组 + * @return ResultMap + */ + @PostMapping(path = "/deletejob") + @ResponseBody + public JSONObject deletejob(String jName, String jGroup) { + JSONObject jsonObject = new JSONObject(); + try { + quartzService.deletejob(jName, jGroup); + jsonObject.put("code",200); + jsonObject.put("msg","删除任务成功"); + } catch (SchedulerException e) { + e.printStackTrace(); + jsonObject.put("code",400); + jsonObject.put("msg","删除任务失败"); + } + return jsonObject; + } + + /** + * 查询任务 + * + * @param pageNum 页码 + * @param pageSize 每页显示多少条数据 + * @return Map + */ + @GetMapping(path = "/queryjob") + @ResponseBody + public JSONObject queryjob(Integer pageNum, Integer pageSize) { + JSONObject jsonObject = new JSONObject(); + PageInfo pageInfo = quartzService.getJobAndTriggerDetails(pageNum, pageSize); + Map map = new HashMap<>(); + if (!StringUtils.isEmpty(pageInfo.getTotal())) { + map.put("JobAndTrigger", pageInfo); + map.put("number", pageInfo.getTotal()); + jsonObject.put("code",200); + jsonObject.put("msg","查询任务成功"); + jsonObject.put("data",map); + }else{ + jsonObject.put("code",400); + jsonObject.put("msg","查询任务成功失败,没有数据"); + } + return jsonObject; + } +} diff --git a/src/main/java/cn/chjyj/szwh/dto/JobAndTriggerDto.java b/src/main/java/cn/chjyj/szwh/dto/JobAndTriggerDto.java new file mode 100644 index 0000000..8c75ef9 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/dto/JobAndTriggerDto.java @@ -0,0 +1,100 @@ +package cn.chjyj.szwh.dto; + +import java.math.BigInteger; + +/** + *@Author: CJ + *@Date: 2021-11-2 14:15 + */ +public class JobAndTriggerDto { + + private String JOB_NAME; + + private String JOB_GROUP; + + private String JOB_CLASS_NAME; + + private String TRIGGER_NAME; + + private String TRIGGER_GROUP; + + private BigInteger REPEAT_INTERVAL; + + private BigInteger TIMES_TRIGGERED; + + private String CRON_EXPRESSION; + + private String TIME_ZONE_ID; + + public String getJOB_NAME() { + return JOB_NAME; + } + + public void setJOB_NAME(String JOB_NAME) { + this.JOB_NAME = JOB_NAME; + } + + public String getJOB_GROUP() { + return JOB_GROUP; + } + + public void setJOB_GROUP(String JOB_GROUP) { + this.JOB_GROUP = JOB_GROUP; + } + + public String getJOB_CLASS_NAME() { + return JOB_CLASS_NAME; + } + + public void setJOB_CLASS_NAME(String JOB_CLASS_NAME) { + this.JOB_CLASS_NAME = JOB_CLASS_NAME; + } + + public String getTRIGGER_NAME() { + return TRIGGER_NAME; + } + + public void setTRIGGER_NAME(String TRIGGER_NAME) { + this.TRIGGER_NAME = TRIGGER_NAME; + } + + public String getTRIGGER_GROUP() { + return TRIGGER_GROUP; + } + + public void setTRIGGER_GROUP(String TRIGGER_GROUP) { + this.TRIGGER_GROUP = TRIGGER_GROUP; + } + + public BigInteger getREPEAT_INTERVAL() { + return REPEAT_INTERVAL; + } + + public void setREPEAT_INTERVAL(BigInteger REPEAT_INTERVAL) { + this.REPEAT_INTERVAL = REPEAT_INTERVAL; + } + + public BigInteger getTIMES_TRIGGERED() { + return TIMES_TRIGGERED; + } + + public void setTIMES_TRIGGERED(BigInteger TIMES_TRIGGERED) { + this.TIMES_TRIGGERED = TIMES_TRIGGERED; + } + + public String getCRON_EXPRESSION() { + return CRON_EXPRESSION; + } + + public void setCRON_EXPRESSION(String CRON_EXPRESSION) { + this.CRON_EXPRESSION = CRON_EXPRESSION; + } + + public String getTIME_ZONE_ID() { + return TIME_ZONE_ID; + } + + public void setTIME_ZONE_ID(String TIME_ZONE_ID) { + this.TIME_ZONE_ID = TIME_ZONE_ID; + } +} diff --git a/src/main/java/cn/chjyj/szwh/job/HelloJob.java b/src/main/java/cn/chjyj/szwh/job/HelloJob.java new file mode 100644 index 0000000..a5db62d --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/job/HelloJob.java @@ -0,0 +1,29 @@ +package cn.chjyj.szwh.job; + + +import cn.chjyj.szwh.dto.JobAndTriggerDto; +import cn.chjyj.szwh.service.QuartzService; +import com.github.pagehelper.PageInfo; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; + +/** + *@Author: CJ + *@Date: 2021-11-2 11:33 + */ +public class HelloJob implements Job { + private static Log log = LogFactory.getLog(HelloJob.class); + @Autowired + private QuartzService quartzService; + + @Override + public void execute(JobExecutionContext jobExecutionContext) { + //QuartzService quartzService = (QuartzService) SpringUtil.getBean("quartzServiceImpl"); + PageInfo jobAndTriggerDetails = quartzService.getJobAndTriggerDetails(1, 10); + log.info("任务列表总数为:" + jobAndTriggerDetails.getTotal()); + log.info("Hello Job执行时间: " + System.currentTimeMillis()); + } +} diff --git a/src/main/java/cn/chjyj/szwh/mapper/CronTriggerMapper.java b/src/main/java/cn/chjyj/szwh/mapper/CronTriggerMapper.java new file mode 100644 index 0000000..5334773 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/mapper/CronTriggerMapper.java @@ -0,0 +1,18 @@ +package cn.chjyj.szwh.mapper; + +import org.example.pojo.CronTrigger; +import org.example.pojo.CronTriggerKey; + +public interface CronTriggerMapper { + int deleteByPrimaryKey(CronTriggerKey key); + + int insert(CronTrigger record); + + int insertSelective(CronTrigger record); + + CronTrigger selectByPrimaryKey(CronTriggerKey key); + + int updateByPrimaryKeySelective(CronTrigger record); + + int updateByPrimaryKey(CronTrigger record); +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/mapper/JobDetailMapper.java b/src/main/java/cn/chjyj/szwh/mapper/JobDetailMapper.java new file mode 100644 index 0000000..e9d680d --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/mapper/JobDetailMapper.java @@ -0,0 +1,28 @@ +package cn.chjyj.szwh.mapper; + + +import cn.chjyj.szwh.bean.JobDetail; +import cn.chjyj.szwh.bean.JobDetailKey; +import cn.chjyj.szwh.dto.JobAndTriggerDto; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public interface JobDetailMapper { + int deleteByPrimaryKey(JobDetailKey key); + + int insert(JobDetail record); + + int insertSelective(JobDetail record); + + JobDetail selectByPrimaryKey(JobDetailKey key); + + int updateByPrimaryKeySelective(JobDetail record); + + int updateByPrimaryKeyWithBLOBs(JobDetail record); + + int updateByPrimaryKey(JobDetail record); + + List getJobAndTriggerDetails(); +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/mapper/TriggerMapper.java b/src/main/java/cn/chjyj/szwh/mapper/TriggerMapper.java new file mode 100644 index 0000000..beb9e36 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/mapper/TriggerMapper.java @@ -0,0 +1,20 @@ +package cn.chjyj.szwh.mapper; + +import org.example.pojo.Trigger; +import org.example.pojo.TriggerKey; + +public interface TriggerMapper { + int deleteByPrimaryKey(TriggerKey key); + + int insert(Trigger record); + + int insertSelective(Trigger record); + + Trigger selectByPrimaryKey(TriggerKey key); + + int updateByPrimaryKeySelective(Trigger record); + + int updateByPrimaryKeyWithBLOBs(Trigger record); + + int updateByPrimaryKey(Trigger record); +} \ No newline at end of file diff --git a/src/main/java/cn/chjyj/szwh/service/QuartzService.java b/src/main/java/cn/chjyj/szwh/service/QuartzService.java new file mode 100644 index 0000000..a3b9922 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/service/QuartzService.java @@ -0,0 +1,24 @@ +package cn.chjyj.szwh.service; + +import cn.chjyj.szwh.dto.JobAndTriggerDto; +import com.github.pagehelper.PageInfo; +import org.quartz.SchedulerException; + +/** + *@Author: CJ + *@Date: 2021-11-2 14:20 + */ +public interface QuartzService { + + PageInfo getJobAndTriggerDetails(Integer pageNum, Integer pageSize); + + void addjob(String jName, String jGroup, String tName, String tGroup, String cron); + + void pausejob(String jName, String jGroupe) throws SchedulerException; + + void resumejob(String jName, String jGroup) throws SchedulerException; + + void rescheduleJob(String jName, String jGroup, String cron) throws SchedulerException; + + void deletejob(String jName, String jGroup) throws SchedulerException; +} diff --git a/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java b/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java index 9746424..289a3db 100644 --- a/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java +++ b/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java @@ -24,6 +24,7 @@ public class OrderServiceImpl implements OrderService { public List getAllOrderList(int page) { int startrs = page>0?(page-1)* ChConstant.PAGESIZE:0; int pageSize =ChConstant.PAGESIZE; + // return orderMapper.getAllOrderList(startrs,pageSize); } diff --git a/src/main/java/cn/chjyj/szwh/service/impl/QuartzServiceImpl.java b/src/main/java/cn/chjyj/szwh/service/impl/QuartzServiceImpl.java new file mode 100644 index 0000000..f27cd58 --- /dev/null +++ b/src/main/java/cn/chjyj/szwh/service/impl/QuartzServiceImpl.java @@ -0,0 +1,98 @@ +package cn.chjyj.szwh.service.impl; + +import cn.chjyj.szwh.dto.JobAndTriggerDto; +import cn.chjyj.szwh.job.HelloJob; +import cn.chjyj.szwh.mapper.JobDetailMapper; +import cn.chjyj.szwh.service.QuartzService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.quartz.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *@Author: CJ + *@Date: 2021-11-2 14:20 + */ + +@Service +public class QuartzServiceImpl implements QuartzService { + private Log log = LogFactory.getLog(QuartzServiceImpl.class); + + @Autowired + private JobDetailMapper jobDetailMapper; + + @Autowired + private Scheduler scheduler; + + @Override + public PageInfo getJobAndTriggerDetails(Integer pageNum, Integer pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = jobDetailMapper.getJobAndTriggerDetails(); + PageInfo pageInfo = new PageInfo<>(list); + return pageInfo; + } + + /** + * 新增定时任务 + * + * @param jName 任务名称 + * @param jGroup 任务组 + * @param tName 触发器名称 + * @param tGroup 触发器组 + * @param cron cron表达式 + */ + @Override + public void addjob(String jName, String jGroup, String tName, String tGroup, String cron) { + try { + // 构建JobDetail + JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) + .withIdentity(jName, jGroup) + .build(); + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger() + .withIdentity(tName, tGroup) + .startNow() + .withSchedule(CronScheduleBuilder.cronSchedule(cron)) + .build(); + // 启动调度器 + scheduler.start(); + scheduler.scheduleJob(jobDetail, trigger); + } catch (Exception e) { + log.info("创建定时任务失败" + e); + } + } + + @Override + public void pausejob(String jName, String jGroup) throws SchedulerException { + scheduler.pauseJob(JobKey.jobKey(jName, jGroup)); + } + + @Override + public void resumejob(String jName, String jGroup) throws SchedulerException { + scheduler.resumeJob(JobKey.jobKey(jName, jGroup)); + } + + @Override + public void rescheduleJob(String jName, String jGroup, String cron) throws SchedulerException { + TriggerKey triggerKey = TriggerKey.triggerKey(jName, jGroup); + // 表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + // 按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 按新的trigger重新设置job执行,重启触发器 + scheduler.rescheduleJob(triggerKey, trigger); + } + + @Override + public void deletejob(String jName, String jGroup) throws SchedulerException { + scheduler.pauseTrigger(TriggerKey.triggerKey(jName, jGroup)); + scheduler.unscheduleJob(TriggerKey.triggerKey(jName, jGroup)); + scheduler.deleteJob(JobKey.jobKey(jName, jGroup)); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 64d89ff..f241934 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,4 +17,13 @@ spring.redis.port=6379 spring.redis.jedis.pool.enabled=true # 最大连接 spring.redis.jedis.pool.max-active=8 -spring.redis.jedis.pool.max-wait=-1 \ No newline at end of file +spring.redis.jedis.pool.max-wait=-1 + +# 存放在数据库 +spring.quartz.job-store-type=jdbc +# 是否等待任务执行完毕后,容器才会关闭 +spring.quartz.wait-for-jobs-to-complete-on-shutdown=true +# 容器名称 +spring.quartz.scheduler-name=SzwhScheduler +spring.quartz.properties=classpath:quatz.properties +spring.quartz \ No newline at end of file diff --git a/src/main/resources/mapper/szwh/CronTriggerMapper.xml b/src/main/resources/mapper/szwh/CronTriggerMapper.xml new file mode 100644 index 0000000..e7c274f --- /dev/null +++ b/src/main/resources/mapper/szwh/CronTriggerMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, CRON_EXPRESSION, TIME_ZONE_ID + + + + delete from qrtz_cron_triggers + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + + insert into qrtz_cron_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, + CRON_EXPRESSION, TIME_ZONE_ID) + values (#{schedName,jdbcType=VARCHAR}, #{triggerName,jdbcType=VARCHAR}, #{triggerGroup,jdbcType=VARCHAR}, + #{cronExpression,jdbcType=VARCHAR}, #{timeZoneId,jdbcType=VARCHAR}) + + + insert into qrtz_cron_triggers + + + SCHED_NAME, + + + TRIGGER_NAME, + + + TRIGGER_GROUP, + + + CRON_EXPRESSION, + + + TIME_ZONE_ID, + + + + + #{schedName,jdbcType=VARCHAR}, + + + #{triggerName,jdbcType=VARCHAR}, + + + #{triggerGroup,jdbcType=VARCHAR}, + + + #{cronExpression,jdbcType=VARCHAR}, + + + #{timeZoneId,jdbcType=VARCHAR}, + + + + + update qrtz_cron_triggers + + + CRON_EXPRESSION = #{cronExpression,jdbcType=VARCHAR}, + + + TIME_ZONE_ID = #{timeZoneId,jdbcType=VARCHAR}, + + + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + + update qrtz_cron_triggers + set CRON_EXPRESSION = #{cronExpression,jdbcType=VARCHAR}, + TIME_ZONE_ID = #{timeZoneId,jdbcType=VARCHAR} + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/src/main/resources/mapper/szwh/JobDetailMapper.xml b/src/main/resources/mapper/szwh/JobDetailMapper.xml new file mode 100644 index 0000000..f0b220f --- /dev/null +++ b/src/main/resources/mapper/szwh/JobDetailMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + SCHED_NAME + , JOB_NAME, JOB_GROUP, DESCRIPTION, JOB_CLASS_NAME, IS_DURABLE, IS_NONCONCURRENT, + IS_UPDATE_DATA, REQUESTS_RECOVERY + + + JOB_DATA + + + + + + + delete + from qrtz_job_details + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and JOB_NAME = #{jobName,jdbcType=VARCHAR} + and JOB_GROUP = #{jobGroup,jdbcType=VARCHAR} + + + insert into qrtz_job_details (SCHED_NAME, JOB_NAME, JOB_GROUP, + DESCRIPTION, JOB_CLASS_NAME, IS_DURABLE, + IS_NONCONCURRENT, IS_UPDATE_DATA, REQUESTS_RECOVERY, + JOB_DATA) + values (#{schedName,jdbcType=VARCHAR}, #{jobName,jdbcType=VARCHAR}, #{jobGroup,jdbcType=VARCHAR}, + #{description,jdbcType=VARCHAR}, #{jobClassName,jdbcType=VARCHAR}, #{isDurable,jdbcType=VARCHAR}, + #{isNonconcurrent,jdbcType=VARCHAR}, #{isUpdateData,jdbcType=VARCHAR}, + #{requestsRecovery,jdbcType=VARCHAR}, + #{jobData,jdbcType=LONGVARBINARY}) + + + insert into qrtz_job_details + + + SCHED_NAME, + + + JOB_NAME, + + + JOB_GROUP, + + + DESCRIPTION, + + + JOB_CLASS_NAME, + + + IS_DURABLE, + + + IS_NONCONCURRENT, + + + IS_UPDATE_DATA, + + + REQUESTS_RECOVERY, + + + JOB_DATA, + + + + + #{schedName,jdbcType=VARCHAR}, + + + #{jobName,jdbcType=VARCHAR}, + + + #{jobGroup,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{jobClassName,jdbcType=VARCHAR}, + + + #{isDurable,jdbcType=VARCHAR}, + + + #{isNonconcurrent,jdbcType=VARCHAR}, + + + #{isUpdateData,jdbcType=VARCHAR}, + + + #{requestsRecovery,jdbcType=VARCHAR}, + + + #{jobData,jdbcType=LONGVARBINARY}, + + + + + update qrtz_job_details + + + DESCRIPTION = #{description,jdbcType=VARCHAR}, + + + JOB_CLASS_NAME = #{jobClassName,jdbcType=VARCHAR}, + + + IS_DURABLE = #{isDurable,jdbcType=VARCHAR}, + + + IS_NONCONCURRENT = #{isNonconcurrent,jdbcType=VARCHAR}, + + + IS_UPDATE_DATA = #{isUpdateData,jdbcType=VARCHAR}, + + + REQUESTS_RECOVERY = #{requestsRecovery,jdbcType=VARCHAR}, + + + JOB_DATA = #{jobData,jdbcType=LONGVARBINARY}, + + + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and JOB_NAME = #{jobName,jdbcType=VARCHAR} + and JOB_GROUP = #{jobGroup,jdbcType=VARCHAR} + + + update qrtz_job_details + set DESCRIPTION = #{description,jdbcType=VARCHAR}, + JOB_CLASS_NAME = #{jobClassName,jdbcType=VARCHAR}, + IS_DURABLE = #{isDurable,jdbcType=VARCHAR}, + IS_NONCONCURRENT = #{isNonconcurrent,jdbcType=VARCHAR}, + IS_UPDATE_DATA = #{isUpdateData,jdbcType=VARCHAR}, + REQUESTS_RECOVERY = #{requestsRecovery,jdbcType=VARCHAR}, + JOB_DATA = #{jobData,jdbcType=LONGVARBINARY} + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and JOB_NAME = #{jobName,jdbcType=VARCHAR} + and JOB_GROUP = #{jobGroup,jdbcType=VARCHAR} + + + update qrtz_job_details + set DESCRIPTION = #{description,jdbcType=VARCHAR}, + JOB_CLASS_NAME = #{jobClassName,jdbcType=VARCHAR}, + IS_DURABLE = #{isDurable,jdbcType=VARCHAR}, + IS_NONCONCURRENT = #{isNonconcurrent,jdbcType=VARCHAR}, + IS_UPDATE_DATA = #{isUpdateData,jdbcType=VARCHAR}, + REQUESTS_RECOVERY = #{requestsRecovery,jdbcType=VARCHAR} + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and JOB_NAME = #{jobName,jdbcType=VARCHAR} + and JOB_GROUP = #{jobGroup,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/src/main/resources/mapper/szwh/TriggerMapper.xml b/src/main/resources/mapper/szwh/TriggerMapper.xml new file mode 100644 index 0000000..203f11f --- /dev/null +++ b/src/main/resources/mapper/szwh/TriggerMapper.xml @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, JOB_NAME, JOB_GROUP, DESCRIPTION, NEXT_FIRE_TIME, + PREV_FIRE_TIME, PRIORITY, TRIGGER_STATE, TRIGGER_TYPE, START_TIME, END_TIME, CALENDAR_NAME, + MISFIRE_INSTR + + + JOB_DATA + + + + delete from qrtz_triggers + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + + insert into qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, + JOB_NAME, JOB_GROUP, DESCRIPTION, + NEXT_FIRE_TIME, PREV_FIRE_TIME, PRIORITY, + TRIGGER_STATE, TRIGGER_TYPE, START_TIME, + END_TIME, CALENDAR_NAME, MISFIRE_INSTR, + JOB_DATA) + values (#{schedName,jdbcType=VARCHAR}, #{triggerName,jdbcType=VARCHAR}, #{triggerGroup,jdbcType=VARCHAR}, + #{jobName,jdbcType=VARCHAR}, #{jobGroup,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, + #{nextFireTime,jdbcType=BIGINT}, #{prevFireTime,jdbcType=BIGINT}, #{priority,jdbcType=INTEGER}, + #{triggerState,jdbcType=VARCHAR}, #{triggerType,jdbcType=VARCHAR}, #{startTime,jdbcType=BIGINT}, + #{endTime,jdbcType=BIGINT}, #{calendarName,jdbcType=VARCHAR}, #{misfireInstr,jdbcType=SMALLINT}, + #{jobData,jdbcType=LONGVARBINARY}) + + + insert into qrtz_triggers + + + SCHED_NAME, + + + TRIGGER_NAME, + + + TRIGGER_GROUP, + + + JOB_NAME, + + + JOB_GROUP, + + + DESCRIPTION, + + + NEXT_FIRE_TIME, + + + PREV_FIRE_TIME, + + + PRIORITY, + + + TRIGGER_STATE, + + + TRIGGER_TYPE, + + + START_TIME, + + + END_TIME, + + + CALENDAR_NAME, + + + MISFIRE_INSTR, + + + JOB_DATA, + + + + + #{schedName,jdbcType=VARCHAR}, + + + #{triggerName,jdbcType=VARCHAR}, + + + #{triggerGroup,jdbcType=VARCHAR}, + + + #{jobName,jdbcType=VARCHAR}, + + + #{jobGroup,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{nextFireTime,jdbcType=BIGINT}, + + + #{prevFireTime,jdbcType=BIGINT}, + + + #{priority,jdbcType=INTEGER}, + + + #{triggerState,jdbcType=VARCHAR}, + + + #{triggerType,jdbcType=VARCHAR}, + + + #{startTime,jdbcType=BIGINT}, + + + #{endTime,jdbcType=BIGINT}, + + + #{calendarName,jdbcType=VARCHAR}, + + + #{misfireInstr,jdbcType=SMALLINT}, + + + #{jobData,jdbcType=LONGVARBINARY}, + + + + + update qrtz_triggers + + + JOB_NAME = #{jobName,jdbcType=VARCHAR}, + + + JOB_GROUP = #{jobGroup,jdbcType=VARCHAR}, + + + DESCRIPTION = #{description,jdbcType=VARCHAR}, + + + NEXT_FIRE_TIME = #{nextFireTime,jdbcType=BIGINT}, + + + PREV_FIRE_TIME = #{prevFireTime,jdbcType=BIGINT}, + + + PRIORITY = #{priority,jdbcType=INTEGER}, + + + TRIGGER_STATE = #{triggerState,jdbcType=VARCHAR}, + + + TRIGGER_TYPE = #{triggerType,jdbcType=VARCHAR}, + + + START_TIME = #{startTime,jdbcType=BIGINT}, + + + END_TIME = #{endTime,jdbcType=BIGINT}, + + + CALENDAR_NAME = #{calendarName,jdbcType=VARCHAR}, + + + MISFIRE_INSTR = #{misfireInstr,jdbcType=SMALLINT}, + + + JOB_DATA = #{jobData,jdbcType=LONGVARBINARY}, + + + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + + update qrtz_triggers + set JOB_NAME = #{jobName,jdbcType=VARCHAR}, + JOB_GROUP = #{jobGroup,jdbcType=VARCHAR}, + DESCRIPTION = #{description,jdbcType=VARCHAR}, + NEXT_FIRE_TIME = #{nextFireTime,jdbcType=BIGINT}, + PREV_FIRE_TIME = #{prevFireTime,jdbcType=BIGINT}, + PRIORITY = #{priority,jdbcType=INTEGER}, + TRIGGER_STATE = #{triggerState,jdbcType=VARCHAR}, + TRIGGER_TYPE = #{triggerType,jdbcType=VARCHAR}, + START_TIME = #{startTime,jdbcType=BIGINT}, + END_TIME = #{endTime,jdbcType=BIGINT}, + CALENDAR_NAME = #{calendarName,jdbcType=VARCHAR}, + MISFIRE_INSTR = #{misfireInstr,jdbcType=SMALLINT}, + JOB_DATA = #{jobData,jdbcType=LONGVARBINARY} + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + + update qrtz_triggers + set JOB_NAME = #{jobName,jdbcType=VARCHAR}, + JOB_GROUP = #{jobGroup,jdbcType=VARCHAR}, + DESCRIPTION = #{description,jdbcType=VARCHAR}, + NEXT_FIRE_TIME = #{nextFireTime,jdbcType=BIGINT}, + PREV_FIRE_TIME = #{prevFireTime,jdbcType=BIGINT}, + PRIORITY = #{priority,jdbcType=INTEGER}, + TRIGGER_STATE = #{triggerState,jdbcType=VARCHAR}, + TRIGGER_TYPE = #{triggerType,jdbcType=VARCHAR}, + START_TIME = #{startTime,jdbcType=BIGINT}, + END_TIME = #{endTime,jdbcType=BIGINT}, + CALENDAR_NAME = #{calendarName,jdbcType=VARCHAR}, + MISFIRE_INSTR = #{misfireInstr,jdbcType=SMALLINT} + where SCHED_NAME = #{schedName,jdbcType=VARCHAR} + and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR} + and TRIGGER_GROUP = #{triggerGroup,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/src/main/resources/quartz.properties b/src/main/resources/quartz.properties new file mode 100644 index 0000000..e83029b --- /dev/null +++ b/src/main/resources/quartz.properties @@ -0,0 +1,53 @@ +#主要分为scheduler、threadPool、jobStore、dataSource等部分 + + +org.quartz.scheduler.instanceId=AUTO +org.quartz.scheduler.instanceName=DefaultQuartzScheduler +#如果您希望Quartz Scheduler通过RMI作为服务器导出本身,则将“rmi.export”标志设置为true +#在同一个配置文件中为'org.quartz.scheduler.rmi.export'和'org.quartz.scheduler.rmi.proxy'指定一个'true'值是没有意义的,如果你这样做'export'选项将被忽略 +org.quartz.scheduler.rmi.export=false +#如果要连接(使用)远程服务的调度程序,则将“org.quartz.scheduler.rmi.proxy”标志设置为true。您还必须指定RMI注册表进程的主机和端口 - 通常是“localhost”端口1099 +org.quartz.scheduler.rmi.proxy=false +org.quartz.scheduler.wrapJobExecutionInUserTransaction=false + + +#实例化ThreadPool时,使用的线程类为SimpleThreadPool +org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool +#threadCount和threadPriority将以setter的形式注入ThreadPool实例 +#并发个数 如果你只有几个工作每天触发几次 那么1个线程就可以,如果你有成千上万的工作,每分钟都有很多工作 那么久需要50-100之间. +#只有1到100之间的数字是非常实用的 +org.quartz.threadPool.threadCount=5 +#优先级 默认值为5 +org.quartz.threadPool.threadPriority=5 +#可以是“true”或“false”,默认为false +org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true + + +#在被认为“misfired”(失火)之前,调度程序将“tolerate(容忍)”一个Triggers(触发器)将其下一个启动时间通过的毫秒数。默认值(如果您在配置中未输入此属性)为60000(60秒) +org.quartz.jobStore.misfireThreshold=5000 +# 默认存储在内存中,RAMJobStore快速轻便,但是当进程终止时,所有调度信息都会丢失 +#org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore + +#持久化方式,默认存储在内存中,此处使用数据库方式 +org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX +#您需要为JobStore选择一个DriverDelegate才能使用。DriverDelegate负责执行特定数据库可能需要的任何JDBC工作 +# StdJDBCDelegate是一个使用“vanilla”JDBC代码(和SQL语句)来执行其工作的委托,用于完全符合JDBC的驱动程序 +org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate +#可以将“org.quartz.jobStore.useProperties”配置参数设置为“true”(默认为false),以指示JDBCJobStore将JobDataMaps中的所有值都作为字符串, +#因此可以作为名称 - 值对存储而不是在BLOB列中以其序列化形式存储更多复杂的对象。从长远来看,这是更安全的,因为您避免了将非String类序列化为BLOB的类版本问题 +org.quartz.jobStore.useProperties=true +#表前缀 +org.quartz.jobStore.tablePrefix=QRTZ_ +#数据源别名,自定义 +org.quartz.jobStore.dataSource=qzDS + + +#使用阿里的druid作为数据库连接池 +org.quartz.dataSource.qzDS.connectionProvider.class=org.example.config.DruidPoolingconnectionProvider +org.quartz.dataSource.qzDS.URL=jdbc:mysql://127.0.0.1:3306/test_quartz?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC +org.quartz.dataSource.qzDS.user=root +org.quartz.dataSource.qzDS.password=123456 +org.quartz.dataSource.qzDS.driver=com.mysql.jdbc.Driver +org.quartz.dataSource.qzDS.maxConnections=10 +#设置为“true”以打开群集功能。如果您有多个Quartz实例使用同一组数据库表,则此属性必须设置为“true”,否则您将遇到破坏 +#org.quartz.jobStore.isClustered=false diff --git a/szwh.iml b/szwh.iml index 32cb1ac..6959976 100644 --- a/szwh.iml +++ b/szwh.iml @@ -58,9 +58,7 @@ - - @@ -124,5 +122,10 @@ + + + + + \ No newline at end of file