springboot quartz 定时任务 动态修改

引入jar包

<!--定时任务 quartz-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.3.0</version>
        </dependency>

创建一个 JobFactory

package com.golaxy.bda.timer.config;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

/**
 * Created by yuanbaodong on 2018/9/27
 */
@Component
public class JobFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

创建 QuartzConfig

package com.golaxy.bda.timer.config;

import org.quartz.Scheduler;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
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 javax.annotation.Resource;
import java.io.IOException;
import java.util.Properties;

/**
 * Created by yuanbaodong on 2018/9/27
 */
@Configuration
public class QuartzConfig {

    @Resource
    private JobFactory jobFactory;

    @Bean(name="SchedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setQuartzProperties(quartzProperties());
        factory.setJobFactory(jobFactory);
        return factory;
    }

    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        //在quartz.properties中的属性被读取并注入后再初始化对象
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    /*
     * quartz初始化监听器
     */
    @Bean
    public QuartzInitializerListener executorListener() {
        return new QuartzInitializerListener();
    }

    /*
     * 通过SchedulerFactoryBean获取Scheduler的实例
     */
    @Bean(name="Scheduler")
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }
}

创建数据库连接 DruidConnectionProvider

package com.golaxy.bda.timer.conn;

import com.alibaba.druid.pool.DruidDataSource;
import org.quartz.SchedulerException;
import org.quartz.utils.ConnectionProvider;

import java.sql.Connection;
import java.sql.SQLException;


/**
 * Created by yuanbaodong on 2018/9/27
 */
public class DruidConnectionProvider implements ConnectionProvider {
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * 常量配置,与quartz.properties文件的key保持一致(去掉前缀),同时提供set方法,Quartz框架自动注入值。
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */
    //JDBC驱动
    public String driver;
    //JDBC连接串
    public String URL;
    //数据库用户名
    public String user;
    //数据库用户密码
    public String password;
    //数据库最大连接数
    public int maxConnection;
    //数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。
    public String validationQuery;
    private boolean validateOnCheckout;
    private int idleConnectionValidationSeconds;
    public String maxCachedStatementsPerConnection;
    private String discardIdleConnectionsSeconds;
    public static final int DEFAULT_DB_MAX_CONNECTIONS = 100;
    public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120;
    //Druid连接池
    private DruidDataSource datasource;
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * 接口实现
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */
    public Connection getConnection() throws SQLException {
        return datasource.getConnection();
    }
    public void shutdown() throws SQLException {
        datasource.close();
    }
    public void initialize() throws SQLException{
        if (this.URL == null) {
            throw new SQLException("DBPool could not be created: DB URL cannot be null");
        }
        if (this.driver == null) {
            throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!");
        }
        if (this.maxConnection < 0) {
            throw new SQLException("DBPool maxConnectins could not be created: Max connections must be greater than zero!");
        }
        datasource = new DruidDataSource();
        try{
            datasource.setDriverClassName(this.driver);
        } catch (Exception e) {
            try {
                throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);
            } catch (SchedulerException e1) {
            }
        }
        datasource.setUrl(this.URL);
        datasource.setUsername(this.user);
        datasource.setPassword(this.password);
        datasource.setMaxActive(this.maxConnection);
        datasource.setMinIdle(1);
        datasource.setMaxWait(0);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(DEFAULT_DB_MAX_CONNECTIONS);
        if (this.validationQuery != null) {
            datasource.setValidationQuery(this.validationQuery);
            if(!this.validateOnCheckout)
                datasource.setTestOnReturn(true);
            else
                datasource.setTestOnBorrow(true);
            datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);
        }
    }

    public String getDriver() {
        return driver;
    }
    public void setDriver(String driver) {
        this.driver = driver;
    }
    public String getURL() {
        return URL;
    }
    public void setURL(String URL) {
        this.URL = URL;
    }
    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getMaxConnection() {
        return maxConnection;
    }
    public void setMaxConnection(int maxConnection) {
        this.maxConnection = maxConnection;
    }
    public String getValidationQuery() {
        return validationQuery;
    }
    public void setValidationQuery(String validationQuery) {
        this.validationQuery = validationQuery;
    }
    public boolean isValidateOnCheckout() {
        return validateOnCheckout;
    }
    public void setValidateOnCheckout(boolean validateOnCheckout) {
        this.validateOnCheckout = validateOnCheckout;
    }
    public int getIdleConnectionValidationSeconds() {
        return idleConnectionValidationSeconds;
    }
    public void setIdleConnectionValidationSeconds(int idleConnectionValidationSeconds) {
        this.idleConnectionValidationSeconds = idleConnectionValidationSeconds;
    }
    public DruidDataSource getDatasource() {
        return datasource;
    }
    public void setDatasource(DruidDataSource datasource) {
        this.datasource = datasource;
    }
    public String getDiscardIdleConnectionsSeconds() {
        return discardIdleConnectionsSeconds;
    }
    public void setDiscardIdleConnectionsSeconds(String discardIdleConnectionsSeconds) {
        this.discardIdleConnectionsSeconds = discardIdleConnectionsSeconds;
    }
}

创建一个实体类 Schedulejob

package com.golaxy.bda.timer.entity;

import java.util.Date;

public class Schedulejob {
    private String jobid;

    private String classname;

    private String cronexpression;

    private String jobname;

    private String jobgroup;

    private String triggername;

    private String triggergroup;

    private Boolean pause;

    private Boolean enable;

    private String description;

    private Date createtime;

    private Date lastupdatetime;

    private String owner;

    public String getJobid() {
        return jobid;
    }

    public void setJobid(String jobid) {
        this.jobid = jobid == null ? null : jobid.trim();
    }

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        this.classname = classname == null ? null : classname.trim();
    }

    public String getCronexpression() {
        return cronexpression;
    }

    public void setCronexpression(String cronexpression) {
        this.cronexpression = cronexpression == null ? null : cronexpression.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();
    }

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

    public Boolean getPause() {
        return pause;
    }

    public void setPause(Boolean pause) {
        this.pause = pause;
    }

    public Boolean getEnable() {
        return enable;
    }

    public void setEnable(Boolean enable) {
        this.enable = enable;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description == null ? null : description.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public Date getLastupdatetime() {
        return lastupdatetime;
    }

    public void setLastupdatetime(Date lastupdatetime) {
        this.lastupdatetime = lastupdatetime;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner == null ? null : owner.trim();
    }
}

创建job  TimerJob

package com.golaxy.bda.timer.job;

import com.golaxy.bda.oozie.graph.OozieGraph;
import com.golaxy.bda.oozie.parser.OozieGraphXMLParser;
import com.golaxy.bda.persistence.entity.Bdajob;
import com.golaxy.bda.persistence.mapper.BdajobMapper;
import com.golaxy.bda.service.BdajobService;
import org.dom4j.DocumentException;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalTime;

/**
 * Created by yuanbaodong on 2018/9/27
 */
@Component
public class TimerJob implements Job {

    private static Logger logger = LoggerFactory.getLogger(TimerJob.class);

    @Resource
    private BdajobService bdajobService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //获取jobid
        String jobid = context.getJobDetail().getKey().getName();
        logger.info("开始执行定时任务 jobid :{},时间:{}",jobid,LocalTime.now());

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        logger.info("执行定时任务完成 jobid :{},时间:{}",jobid,LocalTime.now());
    }
}

定时任务  详情

package com.golaxy.bda.service.impl;

import com.golaxy.bda.dto.ResultDataDto;
import com.golaxy.bda.service.TimerService;
import com.golaxy.bda.timer.entity.Schedulejob;
import com.golaxy.bda.timer.entity.SchedulejobExample;
import com.golaxy.bda.timer.job.TimerJob;
import com.golaxy.bda.timer.mapper.SchedulejobMapper;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created by yuanbaodong on 2018/9/28
 */
@Service
public class TimerServiceImpl implements TimerService {

    private final static Logger logger = LoggerFactory.getLogger(TimerServiceImpl.class);
    @Resource
    private SchedulejobMapper jobMapper;
    @Autowired
    @Qualifier("Scheduler")
    private Scheduler scheduler;


    @Override
    public ResultDataDto addTimerJob(Schedulejob job) {

        JobDetail jobDetail = JobBuilder.newJob(TimerJob.class) //指定执行类
                .withIdentity(job.getJobid(), job.getJobgroup()) // 这是job的名 、组
                .requestRecovery()
                .withDescription(job.getDescription())
                .build();
        //创建表达式调度构建起
        //misfire 使用默认——以当前时间为触发频率立刻触发一次执行,然后按照Cron频率依次执行
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronexpression());
        //根据传入的cron表达式创建一个触发器
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(job.getTriggername(), job.getTriggergroup())
                .withSchedule(scheduleBuilder).build();
        try {
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
            jobMapper.insertSelective(job);
            logger.info("创建任务成功: {}" ,job.getJobname());
        } catch (SchedulerException e) {
            logger.info("创建任务失败: {}" ,job.getJobname());
            return new  ResultDataDto(e);
        }

        return ResultDataDto.addAddSuccess();
    }

    @Override
    public ResultDataDto updateTimerJob(Schedulejob job) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(job.getTriggername(), job.getTriggergroup());
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronexpression());
            // 按新的cronExpression表达式重新构建trigger
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
            scheduler.rescheduleJob(triggerKey, trigger);
            jobMapper.updateByPrimaryKeySelective(job);
            logger.info("更新任务: {}" ,job.getJobname());
        } catch (SchedulerException e) {
            logger.info("更新失败: {}" ,job.getJobname());
            return new ResultDataDto(e);
        }
        return ResultDataDto.addUpdateSuccess();
    }

    @Override
    public ResultDataDto deleteTimerJob(String jobid) {
        Schedulejob job = jobMapper.selectByPrimaryKey(jobid);
        try {
            scheduler.deleteJob(JobKey.jobKey(job.getJobid(), job.getJobgroup()));
            jobMapper.deleteByPrimaryKey(jobid);
            logger.info("删除任务: {}",job.getJobname());
        } catch (SchedulerException e) {
            logger.info("删除失败: {}",job.getJobname());
            return new ResultDataDto(e);
        }
        return ResultDataDto.addDeleteSuccess();
    }

    @Override
    public ResultDataDto pauseTimerJob(String jobid) {
        Schedulejob job = jobMapper.selectByPrimaryKey(jobid);
        try {
            scheduler.pauseJob(JobKey.jobKey(job.getJobid(), job.getJobgroup()));
            job.setPause(true);
            jobMapper.updateByPrimaryKeySelective(job);
            logger.info("暂停任务: {}" ,job.getJobname());
        } catch (SchedulerException e) {
            logger.info("暂停失败: : {}" ,job.getJobname());
            return new ResultDataDto(e);
        }
        return ResultDataDto.addUpdateSuccess();
    }

    @Override
    public ResultDataDto resumeTimerJob(String jobid) {
        Schedulejob job = jobMapper.selectByPrimaryKey(jobid);
        try {
            scheduler.resumeJob(JobKey.jobKey(job.getJobid(), job.getJobgroup()));
            job.setPause(false);
            jobMapper.updateByPrimaryKeySelective(job);
            logger.info("继续执行任务: {}" ,job.getJobname());
        } catch (SchedulerException e) {
            logger.info("继续任务失败: {}" ,job.getJobname());
            return new ResultDataDto(e);
        }
        return ResultDataDto.addUpdateSuccess();
    }

    @Override
    public ResultDataDto runJob(String jobid) {
        Schedulejob job = jobMapper.selectByPrimaryKey(jobid);
        try {
            scheduler.triggerJob(JobKey.jobKey(job.getJobid(), job.getJobgroup()));
            logger.info("执行任务:{}",job.getJobname());
        } catch (SchedulerException e) {
            logger.info("执行任务失败:{}",job.getJobname());
            return new ResultDataDto(e);
        }
        return ResultDataDto.addSuccess();
    }

    @Override
    public ResultDataDto getTimerJobByOwner(String owner) {
        SchedulejobExample example = new SchedulejobExample();
        SchedulejobExample.Criteria criteria = example.createCriteria();
        criteria.andOwnerEqualTo(owner);
        List<Schedulejob> schedulejobs = jobMapper.selectByExample(example);
        return new ResultDataDto(schedulejobs);
    }


    private Job getClass(String classname) throws Exception {
        String packageName = "com.god.quartz.";
        classname = packageName.concat(classname);
        Class<?> class1 = Class.forName(classname);
        return (Job)class1.newInstance();
    }
}

调用controller   TimerController

package com.golaxy.bda.controller;

import com.golaxy.bda.dto.ResultDataDto;
import com.golaxy.bda.service.TimerService;
import com.golaxy.bda.timer.entity.Schedulejob;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * Created by yuanbaodong on 2018/9/28
 */
@RestController
@RequestMapping("/timer")
public class TimerController {

    /**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * 用 jobid 作为job的name 避免名字重复 ,操作出现问题
     */

    @Resource
    private TimerService timerService;

    /**
     * 添加定时任务
     * @param job
     * @return
     */
    @PostMapping("/save")
    public ResultDataDto addTimerJob(Schedulejob job){
        return timerService.addTimerJob(job);
    }

    /**
     * 更新定时任务
     * @param job
     * @return
     */
    @PostMapping("/update")
    public ResultDataDto updateTimerJob(Schedulejob job){
        return  timerService.updateTimerJob(job);
    }

    /**
     * 删除定时任务
     * @param jobid
     * @return
     */
    @DeleteMapping("/delete/{jobid}")
    public ResultDataDto deleteTimerJob(@PathVariable("jobid") String jobid){
        return timerService.deleteTimerJob(jobid);
    }

    /**
     * 暂停定时任务
     * @param jobid
     * @return
     */
    @PutMapping("/pause/{jobid}")
    public ResultDataDto pauseTimerJob(@PathVariable("jobid")String jobid){
        return timerService.pauseTimerJob(jobid);
    }

    /**
     * 重启定时任务
     * @param jobid
     * @return
     */
    @PutMapping("/resume/{jobid}")
    public ResultDataDto resumeTimerJob(@PathVariable("jobid")String jobid){
        return timerService.resumeTimerJob(jobid);
    }

    /**
     * 运行定时任务
     * @param jobid
     * @return
     */
    @PutMapping("/run/{jobid}")
    public ResultDataDto runJob(@PathVariable("jobid")String jobid){
        return timerService.runJob(jobid);
    }

    @GetMapping("/get/job")
    public ResultDataDto getTimerJobByOwner(String owner){
        return timerService.getTimerJobByOwner(owner);
    }
}

最后 quartz.properties文件

扫描二维码关注公众号,回复: 3509886 查看本文章
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#调度器实例名称
org.quartz.scheduler.instanceName: MyScheduler

org.quartz.scheduler.rmi.export: false

org.quartz.scheduler.rmi.proxy: false

org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
# 是否集群
org.quartz.jobStore.isClustered = true
# 实例ID
#org.quartz.scheduler.instanceId = AUTO

#分布式节点有效性检查时间间隔,单位:毫秒
#org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: false

org.quartz.jobStore.misfireThreshold: 60000

org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix: QRTZ_
org.quartz.jobStore.dataSource: studio0727

org.quartz.dataSource.studio0727.connectionProvider.class: com.golaxy.bda.timer.conn.DruidConnectionProvider
org.quartz.dataSource.studio0727.driver: com.mysql.jdbc.Driver
org.quartz.dataSource.studio0727.URL: jdbc:mysql://10.170.130.112:3306/studio0727?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&nullNamePatternMatchesAll=true
org.quartz.dataSource.studio0727.user: root
org.quartz.dataSource.studio0727.password: root
org.quartz.dataSource.studio0727.maxConnection : 100

数据库 

#
# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
#
# PLEASE consider using mysql with innodb tables to avoid locking issues
#
# In your Quartz properties file, you'll need to set 
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#

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


commit;
/*
Navicat MySQL Data Transfer

Source Server         : 10.170.130.112
Source Server Version : 50720
Source Host           : 10.170.130.112:3306
Source Database       : testquartz

Target Server Type    : MYSQL
Target Server Version : 50720
File Encoding         : 65001

Date: 2018-09-28 17:14:16
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for scheduleJob
-- ----------------------------
DROP TABLE IF EXISTS `scheduleJob`;
CREATE TABLE `scheduleJob` (
  `id` varchar(40) NOT NULL,
  `jobId` varchar(40) DEFAULT NULL,
  `className` varchar(100) DEFAULT NULL COMMENT '执行类',
  `cronExpression` varchar(100) DEFAULT NULL COMMENT '运行时间表达式',
  `jobName` varchar(40) DEFAULT NULL COMMENT 'job名',
  `jobGroup` varchar(40) DEFAULT NULL COMMENT 'job组',
  `triggerName` varchar(40) DEFAULT NULL,
  `triggerGroup` varchar(40) DEFAULT NULL,
  `pause` bit(1) DEFAULT NULL,
  `enable` bit(1) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `createTime` datetime DEFAULT NULL,
  `lastUpdateTime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `owner` varchar(40) DEFAULT NULL COMMENT '拥有者',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

猜你喜欢

转载自blog.csdn.net/qq_38119563/article/details/82908878