1. 程式人生 > >spring boot 整合quartz 定時任務排程

spring boot 整合quartz 定時任務排程

新增依賴:

<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.1</version>
			<exclusions>
				<exclusion>
					<artifactId>slf4j-api</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency><!-- 該依賴必加,裡面有sping對schedule的支援 -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>

配置檔案:quartz.properties


# 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: MyQuartzScheduler
 
#如果使用叢集,instanceId必須唯一,設定成AUTO
org.quartz.scheduler.instanceId = AUTO
 
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
 
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
 
org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore
#============================================================================
 
#
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
 
#儲存方式使用JobStoreTX,也就是資料庫
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#使用自己的配置檔案
org.quartz.jobStore.useProperties:true
#資料庫中quartz表的表名字首
org.quartz.jobStore.tablePrefix:QRTZ_
#qzDS是資料來源名稱,資料來源的qzDs
org.quartz.jobStore.dataSource:qzDS
#是否使用叢集(如果專案只部署到 一臺伺服器,就不用了)
org.quartz.jobStore.isClustered = true
 
#============================================================================
# Configure Datasources
#============================================================================
#配置資料來源
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://211.149.199.68:3306/mypinyu
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:
[email protected]
org.quartz.dataSource.qzDS.maxConnection:10

建立bean工廠:

package com.pinyu.system.task;

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

/**
 * @author ypp 建立時間:2018年10月16日 下午3:02:56
 * @Description: TODO
 */
@Component
public class MyJobFactory extends AdaptableJobFactory {

	@Autowired
	private AutowireCapableBeanFactory capableBeanFactory;

	@Override
	protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
		Object jobInstance = super.createJobInstance(bundle);
		capableBeanFactory.autowireBean(jobInstance); // 這一步解決不能spring注入bean的問題
		return jobInstance;
	}
}

獲取bean工廠並讀取quartz.properties配置資訊:

package com.pinyu.system.task;

import java.io.IOException;
import java.util.Properties;

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
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;

/**
 * @author ypp 建立時間:2018年10月16日 下午3:04:16
 * @Description: TODO(用一句話描述該檔案做什麼)
 */
@Configuration
public class QuartzConfigration {

	@Autowired
	private MyJobFactory myJobFactory;

	// 獲取工廠bean
	@Bean
	public SchedulerFactoryBean schedulerFactoryBean() {
		//Spring提供SchedulerFactoryBean為Scheduler提供配置資訊,並被Spring容器管理其生命週期
		SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
		try {
			//啟動時更新己存在的Job,這樣就不用每次修改targetObject後刪除qrtz_job_details表對應記錄了
	        //factory.setOverwriteExistingJobs(true);
	        // 延時啟動(秒)
	        //factory.setStartupDelay(20);
	        //設定quartz的配置檔案
			schedulerFactoryBean.setQuartzProperties(quartzProperties());
			schedulerFactoryBean.setJobFactory(myJobFactory);
			//設定資料來源(使用系統的主資料來源,覆蓋propertis檔案的dataSource配置)  不設定則使用properties配置的
//			schedulerFactoryBean.setDataSource(dataSource);
			//設定自定義Job Factory,用於Spring管理Job bean
			schedulerFactoryBean.setJobFactory(myJobFactory);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return schedulerFactoryBean;
	}

	// 指定quartz.properties
	@Bean
	public Properties quartzProperties() throws IOException {
		PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
		propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
		propertiesFactoryBean.afterPropertiesSet();
		return propertiesFactoryBean.getObject();
	}

	// 建立schedule
	@Bean(name = "scheduler")
	public Scheduler scheduler() {
		return schedulerFactoryBean().getScheduler();
	}
}

然後從資料庫中取出任務,新增到定時任務中

package com.pinyu.system.service.task.impl;

import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pinyu.system.dao.task.TaskScheduleTriggerDao;
import com.pinyu.system.entity.task.TaskScheduleTrigger;
import com.pinyu.system.service.task.TaskScheduleTriggerService;

/** 
* @author ypp
* 建立時間:2018年10月16日 下午3:28:27 
* @Description: TODO(任務實體service) 
*/
@Service
public class TaskScheduleTriggerServiceImpl implements TaskScheduleTriggerService {
	
	private static final Logger log =  LogManager.getLogger(TaskScheduleTriggerServiceImpl.class); 

	@Autowired
    private Scheduler scheduler;
 
    @Autowired
    private TaskScheduleTriggerDao dao;
 
//    @Scheduled(cron="0 0 23:00 * * ?")  //每天晚上11點呼叫這個方法來更新quartz中的任務
    @Override
    public void refreshTrigger() {  
        try {  
        	//查詢出資料庫中所有的定時任務
            List<TaskScheduleTrigger> jobList = dao.queryAll();
            if(jobList!=null){
             	for(TaskScheduleTrigger scheduleJob : jobList){
            		Integer status = scheduleJob.getStatus(); //該任務觸發器目前的狀態
            		TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
            		CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            		 //說明本條任務還沒有新增到quartz中
                    if (null == trigger) {
                    	if(status.equals(0)){ //如果是禁用,則不用建立觸發器
                    		continue;
                    	}
                    	
                        JobDetail jobDetail=null;
						try {
							//建立JobDetail(資料庫中job_name存的任務全路徑,這裡就可以動態的把任務注入到JobDetail中)
							jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(scheduleJob.getJobName()))
							    .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build();
	                        //表示式排程構建器
	                        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
	                            .getCron());
	                        //按新的cronExpression表示式構建一個新的trigger
	                        trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).withSchedule(scheduleBuilder).build();
	                        //把trigger和jobDetail注入到排程器
	                        scheduler.scheduleJob(jobDetail, trigger);
						} catch (ClassNotFoundException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
                        
                    } else {  //說明查出來的這條任務,已經設定到quartz中了
                        // Trigger已存在,先判斷是否需要刪除,如果不需要,再判定是否時間有變化	
                    	if(status.equals(0)){ //如果是禁用,從quartz中刪除這條任務
                    		JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
                    		scheduler.deleteJob(jobKey);
                    		continue;
                    	}
                    	String searchCron = scheduleJob.getCron(); //獲取資料庫的
                    	String currentCron = trigger.getCronExpression();
                    	if(!searchCron.equals(currentCron)){  //說明該任務有變化,需要更新quartz中的對應的記錄
                    		//表示式排程構建器
                            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);
 
                            //按新的cronExpression表示式重新構建trigger
                            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                                .withSchedule(scheduleBuilder).build();
 
                            //按新的trigger重新設定job執行
                            scheduler.rescheduleJob(triggerKey, trigger);
                    	}
                    }
            	}
            }
        } catch (Exception e) {  
           log.error("定時任務每日重新整理觸發器任務異常,在ScheduleTriggerServiceImpl的方法refreshTrigger中,異常資訊:",e);
        } 
    }
}

資料庫中的資料:

一般job_name和job_group2個欄位用來確定唯一。當然這裡job_name我使用的全限定類名,一般來說滿足需求了,不重複

任務實體類entity  TaskScheduleTrigger:

package com.pinyu.system.entity.task;

import com.pinyu.system.entity.BaseEntity;

/**
 * @author ypp 建立時間:2018年10月16日 下午3:08:09
 * @Description: TODO(任務實體)
 */
public class TaskScheduleTrigger extends BaseEntity {
	/**
	 * 
	 */
	private static final long serialVersionUID = -3664525310637403066L;

	private String cron; // 時間表達式

	private Integer status; // 使用狀態 0:禁用 1:啟用

	private String jobName; // 任務名稱

	private String jobGroup; // 任務分組

	public String getCron() {
		return cron;
	}

	public void setCron(String cron) {
		this.cron = cron;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

	public String getJobName() {
		return jobName;
	}

	public void setJobName(String jobName) {
		this.jobName = jobName;
	}

	public String getJobGroup() {
		return jobGroup;
	}

	public void setJobGroup(String jobGroup) {
		this.jobGroup = jobGroup;
	}

}

下面是自定義的一個定時任務,也就是資料庫裡面儲存的任務,quartz應該是直接從job_name那個資訊找到我的任務執行的類,看下面程式碼:

package com.pinyu.system.task.specific;

import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONArray;
import com.pinyu.system.entity.OperationLogEntity;
import com.pinyu.system.service.OperationLogService;
import com.pinyu.system.service.task.TaskScheduleTriggerService;
import com.pinyu.system.task.Task;
import com.pinyu.system.utils.PropUtils;

/**
 * @author ypp 建立時間:2018年10月16日 下午4:07:53
 * @Description: TODO(訊息輪播)
 */
@Component
public class LogTask extends Task implements Job {

	private static Logger log = LogManager.getLogger(LogTask.class);

	@Autowired
	private TaskScheduleTriggerService taskScheduleTriggerService;
	@Autowired
	private OperationLogService operationLogService;

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		boolean isExecute = false; // 是否已執行業務邏輯
		boolean flag = false; // 業務邏輯執行後返回結果
		try {

			// 可以通過context拿到執行當前任務的quartz中的很多資訊,如當前是哪個trigger在執行該任務
			CronTrigger trigger = (CronTrigger) context.getTrigger();
			String corn = trigger.getCronExpression();
			String jobName = trigger.getKey().getName();
			String jobGroup = trigger.getKey().getGroup();
			List<OperationLogEntity> list = operationLogService.findListByNum(PropUtils.getMessageShowNum());
			if(list!=null&&list.size()>0){
				Object logs = JSONArray.toJSON(list);
				setAttribute("logs", logs);
			}
			log.info("訊息輪播任務執行中");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

LogTask的全限定類名就是資料庫裡面的job_name,當然實體類那張表不是quartz的,是取出來需要往quartz裡面放置任務的,詳見上面已經貼出來的程式碼的TaskScheduleTriggerServiceImpl

最後如果要quartz持久化需要自己建幾張表,指令碼:

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50721
 Source Host           : localhost
 Source Database       : com_hlj_quartz

 Target Server Type    : MySQL
 Target Server Version : 50721
 File Encoding         : utf-8

 Date: 03/23/2018 18:24:12 PM
*/

SET NAMES utf8;
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) COLLATE utf8_bin NOT NULL,
  `TRIGGER_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Table structure for `QRTZ_CALENDARS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CALENDARS`;
CREATE TABLE `QRTZ_CALENDARS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `CALENDAR_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `CALENDAR` blob NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Table structure for `QRTZ_CRON_TRIGGERS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`;
CREATE TABLE `QRTZ_CRON_TRIGGERS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `TRIGGER_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  `CRON_EXPRESSION` varchar(120) COLLATE utf8_bin NOT NULL,
  `TIME_ZONE_ID` varchar(80) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `QRTZ_CRON_TRIGGERS`
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('schedulerFactoryBean', 'com.hlj.quartz.quartz.Job.MyTask', 'group1', '0/1 * * * * ?', 'Asia/Shanghai');
COMMIT;

-- ----------------------------
--  Table structure for `QRTZ_FIRED_TRIGGERS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`;
CREATE TABLE `QRTZ_FIRED_TRIGGERS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `ENTRY_ID` varchar(95) COLLATE utf8_bin NOT NULL,
  `TRIGGER_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  `INSTANCE_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `FIRED_TIME` bigint(13) NOT NULL,
  `SCHED_TIME` bigint(13) NOT NULL,
  `PRIORITY` int(11) NOT NULL,
  `STATE` varchar(16) COLLATE utf8_bin NOT NULL,
  `JOB_NAME` varchar(200) COLLATE utf8_bin DEFAULT NULL,
  `JOB_GROUP` varchar(200) COLLATE utf8_bin DEFAULT NULL,
  `IS_NONCONCURRENT` varchar(1) COLLATE utf8_bin DEFAULT NULL,
  `REQUESTS_RECOVERY` varchar(1) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `QRTZ_FIRED_TRIGGERS`
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_FIRED_TRIGGERS` VALUES ('schedulerFactoryBean', 'JeandeMBP15218004868951521800486937', 'com.hlj.quartz.quartz.Job.MyTask', 'group1', 'JeandeMBP1521800486895', '1521800652011', '1521800653000', '5', 'ACQUIRED', null, null, '0', '0');
COMMIT;

-- ----------------------------
--  Table structure for `QRTZ_JOB_DETAILS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`;
CREATE TABLE `QRTZ_JOB_DETAILS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `JOB_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `JOB_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  `DESCRIPTION` varchar(250) COLLATE utf8_bin DEFAULT NULL,
  `JOB_CLASS_NAME` varchar(250) COLLATE utf8_bin NOT NULL,
  `IS_DURABLE` varchar(1) COLLATE utf8_bin NOT NULL,
  `IS_NONCONCURRENT` varchar(1) COLLATE utf8_bin NOT NULL,
  `IS_UPDATE_DATA` varchar(1) COLLATE utf8_bin NOT NULL,
  `REQUESTS_RECOVERY` varchar(1) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `QRTZ_JOB_DETAILS`
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_JOB_DETAILS` VALUES ('schedulerFactoryBean', 'com.hlj.quartz.quartz.Job.MyTask', 'group1', null, 'com.hlj.quartz.quartz.Job.MyTask', '0', '0', '0', '0', 0xaced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787000737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f40000000000010770800000010000000007800);
COMMIT;

-- ----------------------------
--  Table structure for `QRTZ_LOCKS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_LOCKS`;
CREATE TABLE `QRTZ_LOCKS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `LOCK_NAME` varchar(40) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `QRTZ_LOCKS`
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_LOCKS` VALUES ('schedulerFactoryBean', 'STATE_ACCESS'), ('schedulerFactoryBean', 'TRIGGER_ACCESS');
COMMIT;

-- ----------------------------
--  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) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
--  Table structure for `QRTZ_SCHEDULER_STATE`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`;
CREATE TABLE `QRTZ_SCHEDULER_STATE` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `INSTANCE_NAME` varchar(200) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Records of `QRTZ_SCHEDULER_STATE`
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('schedulerFactoryBean', 'JeandeMBP1521800486895', '1521800648349', '20000');
COMMIT;

-- ----------------------------
--  Table structure for `QRTZ_SIMPLE_TRIGGERS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`;
CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `TRIGGER_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Table structure for `QRTZ_SIMPROP_TRIGGERS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`;
CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `TRIGGER_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  `STR_PROP_1` varchar(512) COLLATE utf8_bin DEFAULT NULL,
  `STR_PROP_2` varchar(512) COLLATE utf8_bin DEFAULT NULL,
  `STR_PROP_3` varchar(512) COLLATE utf8_bin 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) COLLATE utf8_bin DEFAULT NULL,
  `BOOL_PROP_2` varchar(1) COLLATE utf8_bin 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 COLLATE=utf8_bin;

-- ----------------------------
--  Table structure for `QRTZ_TRIGGERS`
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_TRIGGERS`;
CREATE TABLE `QRTZ_TRIGGERS` (
  `SCHED_NAME` varchar(120) COLLATE utf8_bin NOT NULL,
  `TRIGGER_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `TRIGGER_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  `JOB_NAME` varchar(200) COLLATE utf8_bin NOT NULL,
  `JOB_GROUP` varchar(200) COLLATE utf8_bin NOT NULL,
  `DESCRIPTION` varchar(250) COLLATE utf8_bin 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) COLLATE utf8_bin NOT NULL,
  `TRIGGER_TYPE` varchar(8) COLLATE utf8_bin NOT NULL,
  `START_TIME` bigint(13) NOT NULL,
  `END_TIME` bigint(13) DEFAULT NULL,
  `CALENDAR_NAME` varchar(200) COLLATE utf8_bin 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 COLLATE=utf8_bin;

本人也是第一次玩quartz有些也是找的資料,如果有更好的思路辦法或者有錯誤的地方,還望指出,小弟不勝感謝!

相關推薦

spring boot 整合quartz 定時任務排程

新增依賴: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <ver

spring boot整合quartz定時任務案例

blank pos jdk com post 4.0 learn int idea 1.運行環境 開發工具:intellij idea JDK版本:1.8 項目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/spr

Spring整合quartz定時任務排程的cronExpression配置說明(轉載)

Spring整合quartz定時任務排程 "* * * * * *" 欄位   允許值   允許的特殊字元 秒   

Spring Boot整合定時任務

@Scheduled適用與監聽任務較少的,而Quartz適合較多的,為確保可伸縮性,Quartz採用了基於多執行緒的架構。啟動時,框架初始化一套worker執行緒,這套執行緒被排程器用來執行預定的作業。這就是Quartz怎樣能併發執行多個作業的原理。Quartz依賴一套鬆耦合的執行緒池管理部件來管理

Spring Boot 整合定時任務

前言 @Scheduled適用與監聽任務較少的,而Quartz適合較多的,為確保可伸縮性,Quartz採用了基於多執行緒的架構。啟動時,框架初始化一套worker執行緒,這套執行緒被排程器用來執行預定的作業。這就是Quartz怎樣能併發執行多個作業的原理。Quartz依賴一套鬆耦合的執行緒池

SSM框架整合 quartz 定時任務排程

maven的pom.xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&

spring boot —— 整合Scheduling定時任務

Spring 3.0後提供Spring Task實現任務排程,支援按日曆排程,相比Quartz功能稍簡單,但是在開發基本夠用,支 持註解程式設計方式。 序列任務 兩個任務方法由一個執行緒序列執行,方法執行完成task2再執行。  1 在spring boot 啟動類上添加註解:

spring boot 整合quartz實現定時任務排程

1.pom檔案引入 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&

Spring-boot整合Quartz,3、動態配置定時任務

通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業 首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。 設定JobDetail的名字和組

Spring Boot整合quartz實現定時任務並支援切換任務資料來源

org.quartz實現定時任務並自定義切換任務資料來源 在工作中經常會需要使用到定時任務處理各種週期性的任務,org.quar

Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境)

foreign log ride bigint post 業務 設置 ade 營業額 Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境) 轉載:http://www.cnblogs.com/jiafuwei/p/6145280.

[java]spring整合quartz定時任務

quartz適合單系統定時任務,分散式不適合,廢話少說開始 使用 1. <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz<

spring整合quartz定時任務

1.新增Maven的依賴 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactI

Spring Boot筆記之定時任務Quartz

摘要 Spring Boot2.x支援spring-boot-starter-quartz,本文介紹spring-boot-starter-quartz配置及使用。 pom引入 <dependency> <groupId>org.springframew

spring整合quartz定時任務(註解實現)

必備jar:quartz-1.6.5.jar、commons-collections-3.2.jar、commons-logging-1.1.jar //applicationContext.xml增加 xmlns:task="http://www.springframew

Spring Boot 中配置定時任務,實現多線程操作

pre log pri http code china 部分 多線程操作 .net 參考的代碼部分 https://git.oschina.net/jokerForTao/spring_boot_schedule 一目了然!Spring Boot 中配置定時任務,實現

SpringBoot整合Quartz定時任務 的簡單實例 2

哪裏 整合 持久 是否 repeat package prop 創建方式 log (1)什麽是Quartz?(2)Quartz的特點;(3)Quartz專用詞匯說明;(4)Quartz任務調度基本實現原理; 接下來看下具體的內容: (1)什麽是Qua

spring boot 學習(八)定時任務 @Scheduled

gap 前言 ron mas 時區 class html run 手動 SpringBoot 定時任務 @Scheduled 前言 有時候,我們有這樣的需求,需要在每天的某個固定時間或者每隔一段時間讓應用去執行某一個任務。一般情況下,可以使用多線程來實現這個功能;在 Spr

使用spring-boot創建定時任務。同時創建多線程執行定時任務

from vnr thread make oca 工程 遷移 prefix gist 1,下載spring-boot的maven工程:http://start.spring.io/ 直接自定義工程名稱。 2 , 啟動類增加註解:@EnableScheduling 具體的業

spring boot系列4-定時任務-springboot自帶的scheduled超級簡單

需求:建立一個每天凌晨0點執行的定時任務 1.建立任務 /** * @author 天空藍藍的 */ @Slf4j @EnableScheduling @Component public class MyTask { @Async @Scheduled(cron = "0