Quartz task scheduling
1.1 Quartz
- Quartz is a timed task framework, and the basic core usage can be found on the website
- Quartz source: github.com/quartz-sche…
- Quartz website address: www.quartz-scheduler.org/documentati…
- Project source code address: gitee.com/tianxincoor…
1.2 the Scheduler
- Scheduler is the Scheduler in Quartz, which registers, pauses, and deletes Trigger and JobDetail
- A Scheduler has a SchedulerContext, which is used to retrieve information about triggers and tasks
1.3 the Trigger
- Trigger is a Trigger that specifies the period of task execution through cron expression or calendar
- When the system time reaches the time specified by the trigger, the trigger triggers the execution of the task
1.4 JobDetail
- The Job interface is the actual task that needs to be performed
- JobDetail core scheduling realizes the task class of Job class. Trigger and Scheduler actually use JobDetail
1.5 the Job
- The minimum implementation class to complete the task, and any class that needs to be scheduled needs to implement this interface
SpringBoot integration
2.1 Environment Preparation
- Create a SpringBoot project. SpringBoot is based on 2.2.0.release. The complete POM is as follows
- The core dependencies are spring-boot-starter-Quartz,
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0. RELEASE</version>
<relativePath/> <! -- lookup parent from repository -->
</parent>
<groupId>com.codecoord</groupId>
<artifactId>springboot-quartz</artifactId>
<version>1.0</version>
<name>springboot-quartz</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<! -- Public dependencies -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<! -- Quartz dependence -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Copy the code
- Configure data source related links
- Quartz needs the database of documents, so documents need to create a library for Quartz to use, in this case quartz_config
- For other related configurations, see the official website: Official website configuration Reference
server:
port: 8888
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: JDBC: mysql: / / 127.0.0.1:3306 / source? useSSL=false
username: root
password: tianxin
# Timer configuration
quartz:
# Configure related attributes
properties:
org:
quartz:
# data source
dataSource:
globalJobDataSource:
URL must be capitalized
URL: JDBC: mysql: / / 127.0.0.1:3306 / quartz_config? useUnicode=true&characterEncoding=utf-8&useSSL=false
driver: com.mysql.cj.jdbc.Driver
maxConnections: 5
username: root
password: tianxin
The data source type must be specified
provider: hikaricp
scheduler:
instanceName: globalScheduler
# instance id
#instanceId: AUTO
type: com.alibaba.druid.pool.DruidDataSource
jobStore:
# data source
dataSource: globalJobDataSource
# JobStoreTX will be used in a standalone environment, and both commit and rollback will be handled by this class
class: org.quartz.impl.jdbcjobstore.JobStoreTX
# Driver configuration
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# table prefix
tablePrefix: QRTZ_
Thread pool configuration
threadPool:
class: org.quartz.simpl.SimpleThreadPool
# threads
threadCount: 10
# priority
threadPriority: 5
Copy the code
- The data table structure is as follows. The corresponding table structure information is available on Github
- Source address: table structure
drop database quartz_config;
create database quartz_config default character set utf8mb4;
use quartz_config;
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)
);
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)
);
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)
);
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(200) 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)
);
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)
);
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),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
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)
);
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL.PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);
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)
);
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)
);
CREATE TABLE QRTZ_LOCKS
(
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL.PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);
Copy the code
- After the completion of the above steps, quartz&SpringBoot integration of the basic environment is completed, the complete project structure is as follows
2.2 Code Examples
Create a new boot class, SpringBootQuartz
package com.codecoord.springboot.quartz;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* SpringBootQuartz
*
* @author [email protected]
* @date2021/7/20 * /
@SpringBootApplication
public class SpringBootQuartz {
public static void main(String[] args) { SpringApplication.run(SpringBootQuartz.class, args); }}Copy the code
Create a new entity class to receive the underlying task information
package com.codecoord.springboot.quartz.domain;
/** ** *@author [email protected]
* @date2021/7/20 * /
public class JobInfo {
/** * Task name */
private String jobName;
/** * task group */
private String jobGroup;
/** * Trigger name */
private String triggerName;
/** * Trigger group */
private String triggerGroup;
/** * cron expression */
private String cron;
/** * Class name */
private String className;
/** * state */
private String status;
/** * Next execution time */
private String nextTime;
/** * last execution time */
private String prevTime;
/** * Data */
private String config;
public String getJobName(a) {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getJobGroup(a) {
return jobGroup;
}
public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}
public String getTriggerName(a) {
return triggerName;
}
public void setTriggerName(String triggerName) {
this.triggerName = triggerName;
}
public String getTriggerGroup(a) {
return triggerGroup;
}
public void setTriggerGroup(String triggerGroup) {
this.triggerGroup = triggerGroup;
}
public String getCron(a) {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
public String getClassName(a) {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getStatus(a) {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getNextTime(a) {
return nextTime;
}
public void setNextTime(String nextTime) {
this.nextTime = nextTime;
}
public String getPrevTime(a) {
return prevTime;
}
public void setPrevTime(String prevTime) {
this.prevTime = prevTime;
}
public String getConfig(a) {
return config;
}
public void setConfig(String config) {
this.config = config; }}Copy the code
Create a task class for scheduling tasks
package com.codecoord.springboot.quartz.job;
import java.time.LocalDateTime;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
/** * plan to remind **@author [email protected]
* @date2021/7/20 * /
@Component
@DisallowConcurrentExecution
public class PlanRemindJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("PlanRemindJob is executing..."+ LocalDateTime.now()); }}Copy the code
package com.codecoord.springboot.quartz.job;
import java.time.LocalDateTime;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
/** ** time and day reminder **@author [email protected]
* @date2021/7/20 * /
@Component
@DisallowConcurrentExecution
public class TimeEventJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("TimeEventJob executing..."+ LocalDateTime.now()); }}Copy the code
Create a core processing class for adding, deleting, and pausing tasks
package com.codecoord.springboot.quartz.handler;
import com.alibaba.fastjson.JSONObject;
import com.codecoord.springboot.quartz.domain.JobInfo;
import java.util.List;
import java.util.Objects;
import javax.annotation.Resource;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.stereotype.Component;
/** * job Processor **@author [email protected]
* @date2021/7/20 * /
@Component
public class JobHandler {
@Resource
private Scheduler scheduler;
/** * Add task */
@SuppressWarnings("unchecked")
public void addJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {
Objects.requireNonNull(jobInfo, "Mission information cannot be empty.");
// Generate a job key
JobKey jobKey = JobKey.jobKey(jobInfo.getJobName(), jobInfo.getJobGroup());
// Add tasks only when the current task does not exist
if(! scheduler.checkExists(jobKey)) { Class<Job> jobClass = (Class<Job>)Class.forName(jobInfo.getClassName());// Task details
JobDetail jobDetail = JobBuilder
.newJob(jobClass)
.withIdentity(jobKey)
.withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup())
.withDescription(jobInfo.getJobName())
.build();
// Configuration information
jobDetail.getJobDataMap().put("config", jobInfo.getConfig());
// Define the trigger
TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey)
.withSchedule(CronScheduleBuilder.cronSchedule(jobInfo.getCron()))
.build();
scheduler.scheduleJob(jobDetail, trigger);
} else {
throw new SchedulerException(jobInfo.getJobName() + "Task already exists, no need to add it again"); }}/** * Task paused */
public void pauseJob(String jobGroup, String jobName) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
if(scheduler.checkExists(jobKey)) { scheduler.pauseJob(jobKey); }}/** * continue the task */
public void continueJob(String jobGroup, String jobName) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
if(scheduler.checkExists(jobKey)) { scheduler.resumeJob(jobKey); }}/** * Delete the task */
public boolean deleteJob(String jobGroup, String jobName) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
if (scheduler.checkExists(jobKey)) {
return scheduler.deleteJob(jobKey);
}
return false;
}
/** * Get task information */
public JobInfo getJobInfo(String jobGroup, String jobName) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
if(! scheduler.checkExists(jobKey)) {return null;
}
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
if (Objects.isNull(triggers)) {
throw new SchedulerException("Trigger information not obtained");
}
TriggerKey triggerKey = triggers.get(0).getKey();
Trigger.TriggerState triggerState = scheduler.getTriggerState(triggerKey);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
JobInfo jobInfo = new JobInfo();
jobInfo.setJobName(jobGroup);
jobInfo.setJobGroup(jobName);
jobInfo.setTriggerName(triggerKey.getName());
jobInfo.setTriggerGroup(triggerKey.getGroup());
jobInfo.setClassName(jobDetail.getJobClass().getName());
jobInfo.setStatus(triggerState.toString());
if (Objects.nonNull(jobDetail.getJobDataMap())) {
jobInfo.setConfig(JSONObject.toJSONString(jobDetail.getJobDataMap()));
}
CronTrigger theTrigger = (CronTrigger) triggers.get(0);
jobInfo.setCron(theTrigger.getCronExpression());
returnjobInfo; }}Copy the code
Create a Controller interface to provide external operation portals
package com.codecoord.springboot.quartz.controller;
import com.codecoord.springboot.quartz.domain.JobInfo;
import com.codecoord.springboot.quartz.handler.JobHandler;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/** * Quartz controller **@author [email protected]
* @date2021/7/20 * /
@RestController
@RequestMapping("/job")
public class QuartzController {
@Resource
private JobHandler jobHandler;
@Resource
private Scheduler scheduler;
/** * http://localhost:8888/job/all */
@RequestMapping("/all")
public List<JobInfo> list(a) throws SchedulerException {
List<JobInfo> jobInfos = new ArrayList<>();
List<String> triggerGroupNames = scheduler.getTriggerGroupNames();
for (String triggerGroupName : triggerGroupNames) {
Set<TriggerKey> triggerKeySet = scheduler
.getTriggerKeys(GroupMatcher.triggerGroupEquals(triggerGroupName));
for(TriggerKey triggerKey : triggerKeySet) { Trigger trigger = scheduler.getTrigger(triggerKey); JobKey jobKey = trigger.getJobKey(); JobInfo jobInfo = jobHandler.getJobInfo(jobKey.getGroup(), jobKey.getName()); jobInfos.add(jobInfo); }}return jobInfos;
}
/** * http://localhost:8888/job/add * * { * "className": "Com. Codecoord. Springboot. Quartz. Job. PlanRemindJob", * "config" : "configuration information, such as storage json," * "cron" : "* * * * 0/3?" , * "jobGroup": "STANDARD_JOB_GROUP", * "jobName": "scheduled task notification task ", * "triggerGroup": "STANDARD_TRIGGER_GROUP", * "triggerName": "Scheduled task notification trigger" *} * * {* "className": "Com. Codecoord. Springboot. Quartz. Job. TimeEventJob", * "config" : "configuration information, such as storage json," * "cron" : "the 0/10 * * * *?" , * "jobGroup": "STANDARD_JOB_GROUP", * "jobName": "time notification task ", * "triggerGroup": "STANDARD_TRIGGER_GROUP", * "triggerName": "time notification trigger" *} */
@PostMapping("/add")
public JobInfo addJob(@RequestBody JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {
jobHandler.addJob(jobInfo);
return jobInfo;
}
/** * http://localhost:8888/job/pause? JobGroup = STANDARD_JOB_GROUP & jobName = plan task notification task * http://localhost:8888/job/pause? JobGroup =STANDARD_JOB_GROUP&jobName= Time notification task */
@RequestMapping("/pause")
public void pauseJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)
throws SchedulerException {
jobHandler.pauseJob(jobGroup, jobName);
}
/** * http://localhost:8888/job/continue? JobGroup = STANDARD_JOB_GROUP & jobName = plan task notification task * http://localhost:8888/job/continue? JobGroup =STANDARD_JOB_GROUP&jobName= Time notification task */
@RequestMapping("/continue")
public void continueJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)
throws SchedulerException {
jobHandler.continueJob(jobGroup, jobName);
}
/** * http://localhost:8888/job/delete? JobGroup = STANDARD_JOB_GROUP & jobName = plan task notification task * http://localhost:8888/job/delete? JobGroup =STANDARD_JOB_GROUP&jobName= Time notification task */
@RequestMapping("/delete")
public boolean deleteJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)
throws SchedulerException {
returnjobHandler.deleteJob(jobGroup, jobName); }}Copy the code
Quartz test
- Add tasks through tools such as POSTMAN/apiPost, and request data is on the corresponding interface
- Check whether the corresponding tasks are executed and exist in the database, for example, the following three tables
use quartz_config;
select * from QRTZ_CRON_TRIGGERS;
select * from QRTZ_TRIGGERS;
select * from QRTZ_JOB_DETAILS;
Copy the code