springboot 集成quartz带数据库持久化

导包

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();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值