美文网首页
springBoot集成quartz持久化任务调度教程

springBoot集成quartz持久化任务调度教程

作者: 叫我null | 来源:发表于2019-06-13 00:43 被阅读0次

    网上各种集成的方式比较乱,这里总结一下,使用最简化的集成方式。
    适用于SpringBoot2.0.1.RELEASE及以上版本,低版本没有测试
    1、Maven引用

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-quartz</artifactId>
            </dependency>
    

    SpringBoot2不需要再单独引用quartz、quartz-jobs包,已引用的就删了吧。

    2、application.yml 配置文件

    spring:
      quartz:
        properties:
          org:
            quartz:
              scheduler:
                instanceName: clusteredScheduler
                instanceId: AUTO
              jobStore:
                class: org.quartz.impl.jdbcjobstore.JobStoreTX
                driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
                tablePrefix: QRTZ_
                isClustered: true
                clusterCheckinInterval: 10000
                useProperties: false
              threadPool:
                class: org.quartz.simpl.SimpleThreadPool
                threadCount: 10
                threadPriority: 5
                threadsInheritContextClassLoaderOfInitializingThread: true
        #数据库方式
        job-store-type: jdbc
    

    这里可以直接使用yml配置,不需要使用的配置文件

    • 这里使用了jdbc也就是持久化,所以需要为quartz准备一些表,SQL可以从官网下载
    /*
     Navicat Premium Data Transfer
    
     Source Server         : 115
     Source Server Type    : MySQL
     Source Server Version : 50537
     Source Host           : 115.29.32.62
     Source Database       : quartz
    
     Target Server Type    : MySQL
     Target Server Version : 50537
     File Encoding         : utf-8
    
     Date: 09/28/2018 14:11:17 PM
    */
    
    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) NOT NULL,
      `TRIGGER_NAME` varchar(200) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      `BLOB_DATA` blob,
      PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
      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=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_CALENDARS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_CALENDARS`;
    CREATE TABLE `QRTZ_CALENDARS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `CALENDAR_NAME` varchar(200) NOT NULL,
      `CALENDAR` blob NOT NULL,
      PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_CRON_TRIGGERS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`;
    CREATE TABLE `QRTZ_CRON_TRIGGERS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `TRIGGER_NAME` varchar(200) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      `CRON_EXPRESSION` varchar(200) NOT NULL,
      `TIME_ZONE_ID` varchar(80) DEFAULT NULL,
      PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
      CONSTRAINT `QRTZ_CRON_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_FIRED_TRIGGERS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`;
    CREATE TABLE `QRTZ_FIRED_TRIGGERS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `ENTRY_ID` varchar(95) NOT NULL,
      `TRIGGER_NAME` varchar(200) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      `INSTANCE_NAME` varchar(200) NOT NULL,
      `FIRED_TIME` bigint(13) NOT NULL,
      `SCHED_TIME` bigint(13) NOT NULL,
      `PRIORITY` int(11) NOT NULL,
      `STATE` varchar(16) NOT NULL,
      `JOB_NAME` varchar(200) DEFAULT NULL,
      `JOB_GROUP` varchar(200) DEFAULT NULL,
      `IS_NONCONCURRENT` varchar(1) DEFAULT NULL,
      `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,
      PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_JOB_DETAILS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`;
    CREATE TABLE `QRTZ_JOB_DETAILS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `JOB_NAME` varchar(200) NOT NULL,
      `JOB_GROUP` varchar(200) NOT NULL,
      `DESCRIPTION` varchar(250) DEFAULT NULL,
      `JOB_CLASS_NAME` varchar(250) NOT NULL,
      `IS_DURABLE` varchar(1) NOT NULL,
      `IS_NONCONCURRENT` varchar(1) NOT NULL,
      `IS_UPDATE_DATA` varchar(1) NOT NULL,
      `REQUESTS_RECOVERY` varchar(1) NOT NULL,
      `JOB_DATA` blob,
      PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_LOCKS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_LOCKS`;
    CREATE TABLE `QRTZ_LOCKS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `LOCK_NAME` varchar(40) NOT NULL,
      PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_PAUSED_TRIGGER_GRPS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`;
    CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_SCHEDULER_STATE`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`;
    CREATE TABLE `QRTZ_SCHEDULER_STATE` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `INSTANCE_NAME` varchar(200) NOT NULL,
      `LAST_CHECKIN_TIME` bigint(13) NOT NULL,
      `CHECKIN_INTERVAL` bigint(13) NOT NULL,
      PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_SIMPLE_TRIGGERS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`;
    CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `TRIGGER_NAME` varchar(200) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      `REPEAT_COUNT` bigint(7) NOT NULL,
      `REPEAT_INTERVAL` bigint(12) NOT NULL,
      `TIMES_TRIGGERED` bigint(10) NOT NULL,
      PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
      CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_SIMPROP_TRIGGERS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`;
    CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `TRIGGER_NAME` varchar(200) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      `STR_PROP_1` varchar(512) DEFAULT NULL,
      `STR_PROP_2` varchar(512) DEFAULT NULL,
      `STR_PROP_3` varchar(512) DEFAULT NULL,
      `INT_PROP_1` int(11) DEFAULT NULL,
      `INT_PROP_2` int(11) DEFAULT NULL,
      `LONG_PROP_1` bigint(20) DEFAULT NULL,
      `LONG_PROP_2` bigint(20) DEFAULT NULL,
      `DEC_PROP_1` decimal(13,4) DEFAULT NULL,
      `DEC_PROP_2` decimal(13,4) DEFAULT NULL,
      `BOOL_PROP_1` varchar(1) DEFAULT NULL,
      `BOOL_PROP_2` varchar(1) DEFAULT NULL,
      PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
      CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    --  Table structure for `QRTZ_TRIGGERS`
    -- ----------------------------
    DROP TABLE IF EXISTS `QRTZ_TRIGGERS`;
    CREATE TABLE `QRTZ_TRIGGERS` (
      `SCHED_NAME` varchar(120) NOT NULL,
      `TRIGGER_NAME` varchar(200) NOT NULL,
      `TRIGGER_GROUP` varchar(200) NOT NULL,
      `JOB_NAME` varchar(200) NOT NULL,
      `JOB_GROUP` varchar(200) NOT NULL,
      `DESCRIPTION` varchar(250) DEFAULT NULL,
      `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,
      `PREV_FIRE_TIME` bigint(13) DEFAULT NULL,
      `PRIORITY` int(11) DEFAULT NULL,
      `TRIGGER_STATE` varchar(16) NOT NULL,
      `TRIGGER_TYPE` varchar(8) NOT NULL,
      `START_TIME` bigint(13) NOT NULL,
      `END_TIME` bigint(13) DEFAULT NULL,
      `CALENDAR_NAME` varchar(200) DEFAULT NULL,
      `MISFIRE_INSTR` smallint(2) DEFAULT NULL,
      `JOB_DATA` blob,
      PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
      KEY `SCHED_NAME` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
      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=latin1;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    
    • spring的datasource 我没列出来,相信你们会有的

    3、准备个待测试的任务

    @Slf4j
    public class CronJob extends QuartzJobBean {
        @Getter
        @Setter
        private Integer bulletinId;
    
        @Override
        protected void executeInternal(JobExecutionContext context) 
                          throws JobExecutionException {
            log.info("执行定时任务. {}", bulletinId);
        }
    }
    

    4、启动定时任务CronJob,为方便测试,我们直接在ContextStartupListener启动

    /**
     * Created by NULL on 2018/11/25.
     * 应用程序启动后执行
     */
    @Slf4j
    @Component
    @Order(value = 199)
    public class ContextStartupListener implements ApplicationRunner {
    
        @Bean
        public JobDetail jobDetail() {
            return JobBuilder.newJob(CronJob.class)
                    .withIdentity("CronJob")
                    .usingJobData("bulletinId", 1)
                    .storeDurably()
                    .build();
        }
    
    
        @Bean
        public Trigger trigger() {
            CronScheduleBuilder scheduleBuilder = 
                      CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
    
            return TriggerBuilder.newTrigger().forJob(jobDetail())
                    .withIdentity("mytrigger1")
                    .withSchedule(scheduleBuilder)
                    .build();
        }
    
    
        @Override
        public void run(ApplicationArguments var1) throws Exception {
            log.info("ContextStartupListener! start!");
        }
    }
    

    5、启动SpringBoot项目会看到每隔5秒打印一次“执行定时任务. 1”,恭喜你,Demo完成的不错,是时候玩一点有难度的了


    Console 输出日志

    既然我们费了这么些功夫弄quartz肯定不是为了5秒打个日志,这活@Scheduled注解加几行代码就能实现,不信你试试

    @Slf4j
    @Component
    public class ScheduledTask {
        @Scheduled(cron = "*/5 * * * * ?")
        private void process() {
             log.info("执行定时任务:Scheduled. ");
        }
    }
    

    6、下面开始来点有难度的

    • 在程序中启动一个任务
    @Autowired
        private org.quartz.Scheduler Scheduler;
    
      @GetMapping("/add")
        public void doAddJob() throws SchedulerException {
            JobDetail jobDetail = JobBuilder.newJob(CronJob.class)
                    .withIdentity("CronJob")
                    .usingJobData("bulletinId", 1)
                    .storeDurably()
                    .build();
    
            CronScheduleBuilder scheduleBuilder = 
                    CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
    
            Trigger triger = TriggerBuilder.newTrigger().forJob(jobDetail)
                    .withIdentity("mytrigger1")
                    .withSchedule(scheduleBuilder)
                    .build();
    
            Scheduler.scheduleJob(jobDetail, triger);
    }
    
    

    -结束一个任务

        @DeleteMapping("")
        public void doRemoveJob() throws SchedulerException {
    
            JobKey jobKey = new JobKey("CronJob", "DEFAULT");
            JobDetail jobDetail = Scheduler.getJobDetail(jobKey);
            if (null != jobDetail) {
                Scheduler.deleteJob(jobKey);
            }
            
        }
    

    将上面的代码放到控制器,调用一下试试效果吧

    相关文章

      网友评论

          本文标题:springBoot集成quartz持久化任务调度教程

          本文链接:https://www.haomeiwen.com/subject/jkydfctx.html