zoukankan      html  css  js  c++  java
  • Quartz Job scheduling 基础实现代码

    Quartz 集成在 SpringBoot 中分为 configtaskutils controller 和 MVC 的三层即 controllerservicedaoentity

    config

    package com.romition.modules.job.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.quartz.SchedulerFactoryBean;
    
    import javax.sql.DataSource;
    import java.util.Properties;
    
    /**
     * 定时任务配置
     */
    @Configuration
    public class ScheduleConfig {
    
        @Bean
        public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
            SchedulerFactoryBean factory = new SchedulerFactoryBean();
            factory.setDataSource(dataSource);
    
            //quartz参数
            Properties prop = new Properties();
            prop.put("org.quartz.scheduler.instanceName", "ProjectScheduler");
            prop.put("org.quartz.scheduler.instanceId", "AUTO");
            //线程池配置
            prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
            prop.put("org.quartz.threadPool.threadCount", "20");
            prop.put("org.quartz.threadPool.threadPriority", "5");
            //JobStore配置
            prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
            //集群配置
            prop.put("org.quartz.jobStore.isClustered", "true");
            prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
            prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
    
            prop.put("org.quartz.jobStore.misfireThreshold", "12000");
            prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
            prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
    
            //PostgreSQL数据库,需要打开此注释
            //prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
    
            factory.setQuartzProperties(prop);
    
            factory.setSchedulerName("ProjectScheduler");
            //延时启动
            factory.setStartupDelay(30);
            factory.setApplicationContextSchedulerContextKey("applicationContextKey");
            //可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
            factory.setOverwriteExistingJobs(true);
            //设置自动启动,默认为true
            factory.setAutoStartup(true);
    
            return factory;
        }
    }
    
    

    task

    package com.romition.modules.job.task;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    /**
     * 定时任务
     */
    @Component("quartzTask")
    public class quartzTask {
    	private Logger logger = LoggerFactory.getLogger(getClass());
    
    	public void test(String params){
    		logger.info("我是带参数的test3方法,正在被执行,参数为:" + params);
    	}
    
    }
    

    task 里面将运行具体的定时任务业务代码,需要将定时任务的 Class 名称和 Method 名称存入数据库中,并指定 corn 表达式来指定运行周期。

    utils

    package com.romition.modules.job.utils;
    
    import com.romition.common.utils.SpringContextUtils;
    import com.romition.modules.job.entity.ScheduleJobEntity;
    import com.romition.modules.job.entity.ScheduleJobLogEntity;
    import com.romition.modules.job.service.ScheduleJobLogService;
    import org.apache.commons.lang.StringUtils;
    import org.quartz.JobExecutionContext;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    
    import java.util.Date;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    /**
     * 定时任务
     */
    public class ScheduleJob extends QuartzJobBean {
    	private Logger logger = LoggerFactory.getLogger(getClass());
    	private ExecutorService service = Executors.newSingleThreadExecutor();
    
        @Override
        protected void executeInternal(JobExecutionContext context) {
            ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap()
            		.get(ScheduleJobEntity.JOB_PARAM_KEY);
    
            //获取spring bean
            ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean("scheduleJobLogService");
    
            //数据库保存执行记录
            ScheduleJobLogEntity log = new ScheduleJobLogEntity();
            log.setJobId(scheduleJob.getJobId());
            log.setBeanName(scheduleJob.getBeanName());
            log.setMethodName(scheduleJob.getMethodName());
            log.setParams(scheduleJob.getParams());
            log.setCreateTime(new Date());
    
            //任务开始时间
            long startTime = System.currentTimeMillis();
    
            try {
                //执行任务
            	logger.info("任务准备执行,任务ID:" + scheduleJob.getJobId());
                ScheduleRunnable task = new ScheduleRunnable(scheduleJob.getBeanName(),
                		scheduleJob.getMethodName(), scheduleJob.getParams());
                Future<?> future = service.submit(task);
    
    			future.get();
    
    			//任务执行总时长
    			long times = System.currentTimeMillis() - startTime;
    			log.setTimes((int)times);
    			//任务状态    0:成功    1:失败
    			log.setStatus(0);
    
    			logger.info("任务执行完毕,任务ID:" + scheduleJob.getJobId() + "  总共耗时:" + times + "毫秒");
    		} catch (Exception e) {
    			logger.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e);
    
    			//任务执行总时长
    			long times = System.currentTimeMillis() - startTime;
    			log.setTimes((int)times);
    
    			//任务状态    0:成功    1:失败
    			log.setStatus(1);
    			log.setError(StringUtils.substring(e.toString(), 0, 2000));
    		}finally {
    			scheduleJobLogService.insert(log);
    		}
        }
    }
    
    package com.romition.modules.job.utils;
    
    import com.romition.common.exception.RRException;
    import com.romition.common.utils.SpringContextUtils;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.util.ReflectionUtils;
    
    import java.lang.reflect.Method;
    
    /**
     * 执行定时任务
     */
    public class ScheduleRunnable implements Runnable {
    
    	private Object target;
    	private Method method;
    	private String params;
    
    	public ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {
    		this.target = SpringContextUtils.getBean(beanName);
    		this.params = params;
    
    		if(StringUtils.isNotBlank(params)){
    			this.method = target.getClass().getDeclaredMethod(methodName, String.class);
    		}else{
    			this.method = target.getClass().getDeclaredMethod(methodName);
    		}
    	}
    
    	@Override
    	public void run() {
    		try {
    			ReflectionUtils.makeAccessible(method);
    			if(StringUtils.isNotBlank(params)){
    				method.invoke(target, params);
    			}else{
    				method.invoke(target);
    			}
    		}catch (Exception e) {
    			throw new RRException("执行定时任务失败", e);
    		}
    	}
    
    }
    
    package com.romition.modules.job.utils;
    
    import com.romition.common.exception.RRException;
    import com.romition.common.utils.Constant;
    import com.romition.modules.job.entity.ScheduleJobEntity;
    import org.quartz.*;
    
    /**
     * 定时任务工具类
     */
    public class ScheduleUtils {
    
        private final static String JOB_NAME = "TASK_";
    
        /**
         * 获取触发器key
         */
        public static TriggerKey getTriggerKey(Long jobId) {
            return TriggerKey.triggerKey(JOB_NAME + jobId);
        }
    
        /**
         * 获取jobKey
         */
        public static JobKey getJobKey(Long jobId) {
            return JobKey.jobKey(JOB_NAME + jobId);
        }
    
        /**
         * 获取表达式触发器
         */
        public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
            try {
                return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
            } catch (SchedulerException e) {
                throw new RRException("获取定时任务CronTrigger出现异常", e);
            }
        }
    
        /**
         * 创建定时任务
         */
        public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
            try {
            	//构建job信息
                JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
    
                //表达式调度构建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
                		.withMisfireHandlingInstructionDoNothing();
    
                //按新的cronExpression表达式构建一个新的trigger
                CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
    
                //放入参数,运行时的方法可以获取
                jobDetail.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
    
                scheduler.scheduleJob(jobDetail, trigger);
    
                //暂停任务
                if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
                	pauseJob(scheduler, scheduleJob.getJobId());
                }
            } catch (SchedulerException e) {
                throw new RRException("创建定时任务失败", e);
            }
        }
    
        /**
         * 更新定时任务
         */
        public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
            try {
                TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
    
                //表达式调度构建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
                		.withMisfireHandlingInstructionDoNothing();
    
                CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
    
                //按新的cronExpression表达式重新构建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
    
                //参数
                trigger.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
    
                scheduler.rescheduleJob(triggerKey, trigger);
    
                //暂停任务
                if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
                	pauseJob(scheduler, scheduleJob.getJobId());
                }
    
            } catch (SchedulerException e) {
                throw new RRException("更新定时任务失败", e);
            }
        }
    
        /**
         * 立即执行任务
         */
        public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
            try {
            	//参数
            	JobDataMap dataMap = new JobDataMap();
            	dataMap.put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
    
                scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
            } catch (SchedulerException e) {
                throw new RRException("立即执行定时任务失败", e);
            }
        }
    
        /**
         * 暂停任务
         */
        public static void pauseJob(Scheduler scheduler, Long jobId) {
            try {
                scheduler.pauseJob(getJobKey(jobId));
            } catch (SchedulerException e) {
                throw new RRException("暂停定时任务失败", e);
            }
        }
    
        /**
         * 恢复任务
         */
        public static void resumeJob(Scheduler scheduler, Long jobId) {
            try {
                scheduler.resumeJob(getJobKey(jobId));
            } catch (SchedulerException e) {
                throw new RRException("暂停定时任务失败", e);
            }
        }
    
        /**
         * 删除定时任务
         */
        public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
            try {
                scheduler.deleteJob(getJobKey(jobId));
            } catch (SchedulerException e) {
                throw new RRException("删除定时任务失败", e);
            }
        }
    }
    

    MVC 部分

    
    package com.romition.modules.job.entity;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * 定时任务
     */
    public class ScheduleJobEntity implements Serializable {
    
    	private static final long serialVersionUID = 1L;
    
    	/**
    	 * 任务调度参数key
    	 */
        public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
    
    	/**
    	 * 任务id
    	 */
    	private Long jobId;
    
    	/**
    	 * spring bean名称
    	 */
    	private String beanName;
    
    	/**
    	 * 方法名
    	 */
    	private String methodName;
    
    	/**
    	 * 参数
    	 */
    	private String params;
    
    	/**
    	 * cron表达式
    	 */
    	private String cronExpression;
    
    	/**
    	 * 任务状态
    	 */
    	private Integer status;
    
    	/**
    	 * 备注
    	 */
    	private String remark;
    
    	/**
    	 * 创建时间
    	 */
    	private Date createTime;
    
    }
    

    实体主要用于和数据库进行交互,记录具体的 job 。

    package com.romition.modules.job.service.impl;
    
    import com.baomidou.mybatisplus.mapper.EntityWrapper;
    import com.baomidou.mybatisplus.plugins.Page;
    import com.baomidou.mybatisplus.service.impl.ServiceImpl;
    import com.romition.common.utils.Constant;
    import com.romition.common.utils.PageUtils;
    import com.romition.common.utils.Query;
    import com.romition.modules.job.dao.ScheduleJobDao;
    import com.romition.modules.job.entity.ScheduleJobEntity;
    import com.romition.modules.job.service.ScheduleJobService;
    import com.romition.modules.job.utils.ScheduleUtils;
    import org.apache.commons.lang.StringUtils;
    import org.quartz.CronTrigger;
    import org.quartz.Scheduler;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import javax.annotation.PostConstruct;
    import java.util.*;
    
    @Service("scheduleJobService")
    public class ScheduleJobServiceImpl extends ServiceImpl<ScheduleJobDao, ScheduleJobEntity> implements ScheduleJobService {
    	@Autowired
        private Scheduler scheduler;
    
    	/**
    	 * 项目启动时,初始化定时器
    	 */
    	@PostConstruct
    	public void init(){
    		List<ScheduleJobEntity> scheduleJobList = this.selectList(null);
    		for(ScheduleJobEntity scheduleJob : scheduleJobList){
    			CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
                //如果不存在,则创建
                if(cronTrigger == null) {
                    ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
                }else {
                    ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
                }
    		}
    	}
    
    	@Override
    	public PageUtils queryPage(Map<String, Object> params) {
    		String beanName = (String)params.get("beanName");
    
    		Page<ScheduleJobEntity> page = this.selectPage(
    				new Query<ScheduleJobEntity>(params).getPage(),
    				new EntityWrapper<ScheduleJobEntity>().like(StringUtils.isNotBlank(beanName),"bean_name", beanName)
    		);
    
    		return new PageUtils(page);
    	}
    
    
    	@Override
    	@Transactional(rollbackFor = Exception.class)
    	public void save(ScheduleJobEntity scheduleJob) {
    		scheduleJob.setCreateTime(new Date());
    		scheduleJob.setStatus(Constant.ScheduleStatus.NORMAL.getValue());
            this.insert(scheduleJob);
    
            ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
        }
    
    	@Override
    	@Transactional(rollbackFor = Exception.class)
    	public void update(ScheduleJobEntity scheduleJob) {
            ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
    
            this.updateById(scheduleJob);
        }
    
    	@Override
    	@Transactional(rollbackFor = Exception.class)
        public void deleteBatch(Long[] jobIds) {
        	for(Long jobId : jobIds){
        		ScheduleUtils.deleteScheduleJob(scheduler, jobId);
        	}
    
        	//删除数据
        	this.deleteBatchIds(Arrays.asList(jobIds));
    	}
    
    	@Override
        public int updateBatch(Long[] jobIds, int status){
        	Map<String, Object> map = new HashMap<>();
        	map.put("list", jobIds);
        	map.put("status", status);
        	return baseMapper.updateBatch(map);
        }
    
    	@Override
    	@Transactional(rollbackFor = Exception.class)
        public void run(Long[] jobIds) {
        	for(Long jobId : jobIds){
        		ScheduleUtils.run(scheduler, this.selectById(jobId));
        	}
        }
    
    	@Override
    	@Transactional(rollbackFor = Exception.class)
        public void pause(Long[] jobIds) {
            for(Long jobId : jobIds){
        		ScheduleUtils.pauseJob(scheduler, jobId);
        	}
    
        	updateBatch(jobIds, Constant.ScheduleStatus.PAUSE.getValue());
        }
    
    	@Override
    	@Transactional(rollbackFor = Exception.class)
        public void resume(Long[] jobIds) {
        	for(Long jobId : jobIds){
        		ScheduleUtils.resumeJob(scheduler, jobId);
        	}
    
        	updateBatch(jobIds, Constant.ScheduleStatus.NORMAL.getValue());
        }
    
    }
    

    scheduleJobService 实现了对 job 的增删改查等操作,并且在 Spring 容器初始化的时候对 job 进行创建或更新。

    数据库

    /*
     Navicat MySQL Data Transfer
    
     Source Server         : localhost
     Source Server Type    : MySQL
     Source Server Version : 50639
     Source Host           : localhost:3306
     Source Schema         : romition_project
    
     Target Server Type    : MySQL
     Target Server Version : 50639
     File Encoding         : 65001
    
     Date: 23/07/2018 14:04:55
    */
    
    SET NAMES utf8mb4;
    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) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `BLOB_DATA` blob NULL,
      PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
      INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
      CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_calendars
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_calendars`;
    CREATE TABLE `qrtz_calendars`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `CALENDAR_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `CALENDAR` blob NOT NULL,
      PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_cron_triggers
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_cron_triggers`;
    CREATE TABLE `qrtz_cron_triggers`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
      CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_fired_triggers
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_fired_triggers`;
    CREATE TABLE `qrtz_fired_triggers`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `ENTRY_ID` varchar(95) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `INSTANCE_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `FIRED_TIME` bigint(13) NOT NULL,
      `SCHED_TIME` bigint(13) NOT NULL,
      `PRIORITY` int(11) NOT NULL,
      `STATE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `JOB_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `JOB_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE,
      INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE,
      INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE,
      INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_job_details
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_job_details`;
    CREATE TABLE `qrtz_job_details`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `JOB_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `JOB_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `DESCRIPTION` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `IS_DURABLE` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `JOB_DATA` blob NULL,
      PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE,
      INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_locks
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_locks`;
    CREATE TABLE `qrtz_locks`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `LOCK_NAME` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- 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) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_scheduler_state
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_scheduler_state`;
    CREATE TABLE `qrtz_scheduler_state`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `INSTANCE_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `LAST_CHECKIN_TIME` bigint(13) NOT NULL,
      `CHECKIN_INTERVAL` bigint(13) NOT NULL,
      PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_simple_triggers
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_simple_triggers`;
    CREATE TABLE `qrtz_simple_triggers`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci 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`) USING BTREE,
      CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_simprop_triggers
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_simprop_triggers`;
    CREATE TABLE `qrtz_simprop_triggers`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `STR_PROP_1` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `STR_PROP_2` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `STR_PROP_3` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `INT_PROP_1` int(11) NULL DEFAULT NULL,
      `INT_PROP_2` int(11) NULL DEFAULT NULL,
      `LONG_PROP_1` bigint(20) NULL DEFAULT NULL,
      `LONG_PROP_2` bigint(20) NULL DEFAULT NULL,
      `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL,
      `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL,
      `BOOL_PROP_1` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `BOOL_PROP_2` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
      CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for qrtz_triggers
    -- ----------------------------
    DROP TABLE IF EXISTS `qrtz_triggers`;
    CREATE TABLE `qrtz_triggers`  (
      `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `JOB_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `JOB_GROUP` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `DESCRIPTION` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL,
      `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL,
      `PRIORITY` int(11) NULL DEFAULT NULL,
      `TRIGGER_STATE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      `START_TIME` bigint(13) NOT NULL,
      `END_TIME` bigint(13) NULL DEFAULT NULL,
      `CALENDAR_NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL,
      `JOB_DATA` blob NULL,
      PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE,
      INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE,
      INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE,
      INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE,
      INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE,
      INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE,
      INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE,
      INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE,
      INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE,
      INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE,
      CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for schedule_job
    -- ----------------------------
    DROP TABLE IF EXISTS `schedule_job`;
    CREATE TABLE `schedule_job`  (
      `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务id',
      `bean_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'spring bean名称',
      `method_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '方法名',
      `params` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数',
      `cron_expression` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'cron表达式',
      `status` tinyint(4) NULL DEFAULT NULL COMMENT '任务状态  0:正常  1:暂停',
      `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
      `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
      PRIMARY KEY (`job_id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '定时任务' ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Table structure for schedule_job_log
    -- ----------------------------
    DROP TABLE IF EXISTS `schedule_job_log`;
    CREATE TABLE `schedule_job_log`  (
      `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志id',
      `job_id` bigint(20) NOT NULL COMMENT '任务id',
      `bean_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'spring bean名称',
      `method_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '方法名',
      `params` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数',
      `status` tinyint(4) NOT NULL COMMENT '任务状态    0:成功    1:失败',
      `error` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '失败信息',
      `times` int(11) NOT NULL COMMENT '耗时(单位:毫秒)',
      `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
      PRIMARY KEY (`log_id`) USING BTREE,
      INDEX `job_id`(`job_id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '定时任务日志' ROW_FORMAT = Compact;
    

    本文由个人 hexo 博客 co2fe.com 迁移
    date: 2018-08-08 20:57:56

  • 相关阅读:
    AOP的实现原理——动态代理
    反射
    代理模式
    sprig——jar包
    spring事务管理
    [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符
    [c++面试准备]--vector对象是如何增长的
    c++面试须知
    redhat--1
    kvm配置虚拟机[待整理]
  • 原文地址:https://www.cnblogs.com/manastudent/p/10190992.html
Copyright © 2011-2022 走看看