引入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;