导包
MAVEN
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
gradle
implementation 'org.springframework.boot:spring-boot-starter-quartz'
配置文件
spring:
quartz:
#相关属性配置
properties:
org:
quartz:
scheduler:
instanceName: clusteredScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
clusterCheckinInterval: 10000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: false
#数据库方式
job-store-type: jdbc
mysql数据库表
/*
Navicat MySQL Data Transfer
Target Server Type : MYSQL
Target Server Version : 50725
File Encoding : 65001
Date: 2019-06-29 15:40:40
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for QRTZ_BLOB_TRIGGERS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`;
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,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_CALENDARS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CALENDARS`;
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 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_CRON_TRIGGERS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`;
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) DEFAULT NULL,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `QRTZ_CRON_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_FIRED_TRIGGERS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`;
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` int(11) NOT NULL,
`STATE` varchar(16) NOT NULL,
`JOB_NAME` varchar(200) DEFAULT NULL,
`JOB_GROUP` varchar(200) DEFAULT NULL,
`IS_NONCONCURRENT` varchar(1) DEFAULT NULL,
`REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,
PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),
KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),
KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),
KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_JOB_DETAILS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`;
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) DEFAULT 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,
PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),
KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_LOCKS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_LOCKS`;
CREATE TABLE `QRTZ_LOCKS` (
`SCHED_NAME` varchar(120) NOT NULL,
`LOCK_NAME` varchar(40) NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`;
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 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_SCHEDULER_STATE
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`;
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 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_SIMPLE_TRIGGERS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`;
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`),
CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_SIMPROP_TRIGGERS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`;
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) DEFAULT NULL,
`STR_PROP_2` varchar(512) DEFAULT NULL,
`STR_PROP_3` varchar(512) DEFAULT NULL,
`INT_PROP_1` int(11) DEFAULT NULL,
`INT_PROP_2` int(11) DEFAULT NULL,
`LONG_PROP_1` bigint(20) DEFAULT NULL,
`LONG_PROP_2` bigint(20) DEFAULT NULL,
`DEC_PROP_1` decimal(13,4) DEFAULT NULL,
`DEC_PROP_2` decimal(13,4) DEFAULT NULL,
`BOOL_PROP_1` varchar(1) DEFAULT NULL,
`BOOL_PROP_2` varchar(1) DEFAULT NULL,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for QRTZ_TRIGGERS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_TRIGGERS`;
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) DEFAULT NULL,
`NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,
`PREV_FIRE_TIME` bigint(13) DEFAULT NULL,
`PRIORITY` int(11) DEFAULT NULL,
`TRIGGER_STATE` varchar(16) NOT NULL,
`TRIGGER_TYPE` varchar(8) NOT NULL,
`START_TIME` bigint(13) NOT NULL,
`END_TIME` bigint(13) DEFAULT NULL,
`CALENDAR_NAME` varchar(200) DEFAULT NULL,
`MISFIRE_INSTR` smallint(2) DEFAULT NULL,
`JOB_DATA` blob,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),
KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
CONSTRAINT `QRTZ_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加接口
package com.rtsm.alarmtcp.quartz.service;
import com.rtsm.alarmtcp.quartz.entity.JobEntity;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.SchedulerException;
/**
* @author EDZ
* @date 2019/3/2913:48
*/
public interface QuartzManager {
void addSimpleJob(JobEntity jobEntity, Class<? extends Job> c, JobDataMap jobDataMap) throws SchedulerException;
void addDateJob(JobEntity jobEntity, Class<? extends Job> job, JobDataMap dataMap) throws SchedulerException;
void subJob(JobEntity jobEntity);
void subJob(String name, String group);
void subJobByGroup(String group);
void addCronJob(JobEntity jobEntity, Class<? extends Job> c, JobDataMap jobDataMap) throws SchedulerException;
String getCorn();
}
package com.rtsm.alarmtcp.quartz.service.impl;
import com.rtsm.alarmtcp.quartz.entity.JobEntity;
import com.rtsm.alarmtcp.quartz.service.QuartzManager;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* 定时任务管理
* @author EDZ
* @date 2019/3/2913:51
*/
@Component
public class QuartzManagerImpl implements QuartzManager {
@Resource
private SchedulerFactoryBean factory;
/**
* jobEntity
* @param jobEntity 任务实体
* @param job 执行任务
* @param dataMap 保存的参数
* @throws SchedulerException
*/
@Override
public void addSimpleJob(JobEntity jobEntity, Class<? extends Job> job, JobDataMap dataMap) throws SchedulerException {
Scheduler schd = factory.getScheduler();
//多少秒之后执行
Date startTime = new Date(System.currentTimeMillis()+jobEntity.getDelaySecond()*1000);
dataMap.put("jobName",jobEntity.getName());
dataMap.put("jobGroup",jobEntity.getJobGroup());
JobDetail jobDetail = JobBuilder.newJob(job)
.withIdentity(jobEntity.getName(),jobEntity.getJobGroup())
.setJobData(dataMap)
.build();
Trigger trigger = TriggerBuilder.newTrigger().
withIdentity(TriggerKey.triggerKey("trigger"+jobEntity.getName(), "trigger"+jobEntity.getJobGroup()))
.startAt(startTime)
.build();
//两者组成一个计划任务注册到scheduler
if(jobEntity.getStatus()!=0){
schd.scheduleJob(jobDetail,trigger);
}
}
/**
* @title addDateJob
* @description 添加到期执行的任务
* @author haifeng.lv
* @param: jobEntity 实体类
* @param: job 执行类
* @param: dataMap 数据
* @updateTime 2019/5/14 19:30
* @throws
*/
@Override
public void addDateJob(JobEntity jobEntity,Class<? extends Job> job,JobDataMap dataMap) throws SchedulerException {
Scheduler schd = factory.getScheduler();
// 名称
dataMap.put("jobName",jobEntity.getName());
// 工作组
dataMap.put("jobGroup",jobEntity.getJobGroup());
// 工作详情
JobDetail jobDetail = JobBuilder.newJob(job)
.withIdentity(jobEntity.getName(),jobEntity.getJobGroup())
.setJobData(dataMap)
.build();
// 设置执行策略
Trigger trigger = TriggerBuilder.newTrigger().
withIdentity(TriggerKey.triggerKey("trigger"+jobEntity.getName(), "trigger"+jobEntity.getJobGroup()))
// 设置开始时间
.startAt((Date)dataMap.get("endDate"))
.build();
//两者组成一个计划任务注册到scheduler
if(jobEntity.getStatus() != 0){
schd.scheduleJob(jobDetail,trigger);
}
}
/**
* 移除任务
* @param jobEntity
*/
@Override
public void subJob(JobEntity jobEntity) {
Scheduler schd=factory.getScheduler();
try {
schd.deleteJob(JobKey.jobKey(jobEntity.getName(),jobEntity.getJobGroup()));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void subJob(String name, String group) {
Scheduler schd=factory.getScheduler();
try {
schd.deleteJob(JobKey.jobKey(name,group));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 根据分组删除定时任务
* @param group
*/
@Override
public void subJobByGroup(String group) {
try {
Scheduler schd=factory.getScheduler();
GroupMatcher<JobKey> matcher = GroupMatcher.groupEquals(group);
Set<JobKey> jobkeySet = schd.getJobKeys(matcher);
List<JobKey> jobkeyList = new ArrayList<JobKey>();
jobkeyList.addAll(jobkeySet);
schd.deleteJobs(jobkeyList);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void addCronJob(JobEntity jobEntity, Class<? extends Job> job, JobDataMap dataMap) throws SchedulerException {
Scheduler schd=factory.getScheduler();
//在初始化调度的时候clean一下
schd.clear();
dataMap.put("jobName",jobEntity.getName());
dataMap.put("jobGroup",jobEntity.getJobGroup());
JobDetail jobDetail = JobBuilder.newJob(job)
.withIdentity(jobEntity.getName(),jobEntity.getJobGroup())
.setJobData(dataMap)
.build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobEntity.getName(),jobEntity.getJobGroup())
.withSchedule(
CronScheduleBuilder.cronSchedule(jobEntity.getCron())
//失效后启动不执行错过任务
.withMisfireHandlingInstructionDoNothing()
).startNow().build();
jobEntity.setParameter(dataMap.toString());
// jobEntityMapper.insert(jobEntity);
//两者组成一个计划任务注册到scheduler
if(jobEntity.getStatus()!=0){
schd.scheduleJob(jobDetail,trigger);
}
// if(!schd.isShutdown()){
// schd.start();//启动调度器
// }
}
@Override
public String getCorn() {
return null;
}
}
添加任务
package com.rtsm.alarmtcp.quartz.job;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @author syx
* @date 2019/4/416:06
*/
@Slf4j
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("hello world,java");
log.info("Hello world,kkkk");
}
}
package com.rtsm.alarmtcp.quartz.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
* time: 2019-03-29
* @author EDZ
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class JobEntity implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String jobGroup;
private String cron;
private String parameter;
/**
* 延时时间
*/
private Integer delaySecond;
/**
* job的执行状态,这里我设置为1/0且只有该值为1才会执行该Job
*/
private Integer status = 1;
public JobEntity(String name, String jobGroup, Integer delaySecond, Integer status) {
this.name = name;
this.jobGroup = jobGroup;
this.delaySecond = delaySecond;
this.status = status;
}
public JobEntity() {
}
}
测试代码
JobEntity job = new JobEntity();
job.setName("1234");
job.setJobGroup("2314");
job.setDelaySecond(10);
try {
quartzManager.addSimpleJob(job,TestJob.class,new JobDataMap());
} catch (SchedulerException e) {
e.printStackTrace();
}