springBoot整合Quartz案例

现在有很多任务调度框架,比如Jfinal-Quartz、elastic-job、EasySchedule 、Quartz 等,最常用的就是Quartz 和elastic-job,这两个框架各有各的好处,Quartz 可以满足复杂的任务调度,并且spring框架对Quartz也有非常好的支持,而elastic-job有elastic-job-console这个控制台,非常方便去调度任务,比如暂停,生效,随时修改job执行时间等。下面是springBoot整合Quartz的小案例(仅供参考)

具体步骤
1、springBoot启动之后,读取数据库中配置的任务;
2、根据数据库配置的任务名、具体类名,执行时间创建任务;
3、加入调度容器,最后启动容器调度任务。

1、引入jar包

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.cn.dl</groupId>
        <artifactId>springbootquartz</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>springbootquartz</name>
        <description>Demo project for Spring Boot</description>
     
        <properties>
            <java.version>1.8</java.version>
        </properties>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
     
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.3.0</version>
            </dependency>
     
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz-jobs</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.46</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.9</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.1</version>
            </dependency>
        </dependencies>
     
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

2、TaskJobBean

    package com.cn.dl.bean;
     
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
     
    /**
     * Created by yanshao on 2018/12/11.
     */
    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public class TaskJobBean {
        //todo 实际开发还有很多属性!!!
        private String jobName;
        private String jobClassName;
        private String jobCron;
    }

3、创建表并插入三条数据

    CREATE TABLE task_job_schedule (
      id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
      job_name varchar(64) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '任务名',
      job_class_name varchar(256) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '任务类名',
      job_cron varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'cron表达式,执行时间',
      dt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      dt_update datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='任务调度表'

     
    insert into task_job_schedule (id, job_name, job_class_name, job_cron, dt_create, dt_update) values('1','jobA','com.cn.dl.task.JobA','0/5 * * * * ? *','2018-12-11 11:34:25','2018-12-11 11:34:25');
    insert into task_job_schedule (id, job_name, job_class_name, job_cron, dt_create, dt_update) values('2','jobB','com.cn.dl.task.JobB','0 0 04 * * ? *','2018-12-11 11:34:29','2018-12-11 11:34:29');
    insert into task_job_schedule (id, job_name, job_class_name, job_cron, dt_create, dt_update) values('3','jobC','com.cn.dl.task.JobC','0/30 * * * * ? *','2018-12-11 11:34:44','2018-12-11 11:34:44');

4、TaskJobMapper

    package com.cn.dl.mapper;
     
    import com.cn.dl.bean.TaskJobBean;
    import org.apache.ibatis.annotations.*;
     
    import java.util.List;
     
    /**
     * Created by yanshao on 2018/12/11.
     */
    @Mapper
    public interface TaskJobMapper {
        @Select("select job_name,job_class_name,job_cron from task_job_schedule")
        List<TaskJobBean> findAllTaskJob();
    }

5、InitTaskJobConfig

    package com.cn.dl.config;
     
    import com.cn.dl.bean.TaskJobBean;
    import com.cn.dl.mapper.TaskJobMapper;
    import lombok.extern.slf4j.Slf4j;
    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    import org.quartz.impl.triggers.CronTriggerImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
     
    import java.util.List;
     
    /**
     * Created by yanshao on 2018/12/11.
     */
    @Component
    @Order(value = 2)
    @Slf4j
    public class InitTaskJobConfig implements CommandLineRunner {
        @Autowired
        TaskJobMapper taskJobMapper;
        @Override
        public void run(String... strings) throws Exception {
     
            //读取所有任务
            List<TaskJobBean> list = taskJobMapper.findAllTaskJob();
            //创建调度容器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            list.stream().forEach(taskJobBean -> {
                try {
                    System.out.println(taskJobBean.toString());
                    //创建具体的可执行的调度程序
                    JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(taskJobBean.getJobClassName())).build();
                    //设置调度参数
                    CronTriggerImpl cronTrigger = new CronTriggerImpl();
                    cronTrigger.setName(taskJobBean.getJobName());
                    cronTrigger.setCronExpression(taskJobBean.getJobCron());
                    //加入调度容器
                    scheduler.scheduleJob(jobDetail, cronTrigger);
                    //启动
                    scheduler.start();
                } catch (Exception e) {
                    log.error("job 启动异常",e);
                }
            });
        }
    }

6、创建三个任务类:JobA、JobB、JobC

    package com.cn.dl.task;
     
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
     
    import java.util.Date;
     
    /**
     * Created by yanshao on 2018/12/11.
     */
    public class JobA implements Job {
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("JobA>>>>>>"+new Date());
        }
    }

其它两个类类似JobA

7、application.properties

    #redis
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.password=tiger
     
    #mybatis
    #开启mybatis驼峰命名,这样可以将mysql中带有下划线的映射成驼峰命名的字段
    mybatis.configuration.map-underscore-to-camel-case=true
     
    #datasource
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tiger_base?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&generateSimpleParameterMetadata=true
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.max-idle=10
    spring.datasource.max-wait=60000
    spring.datasource.min-idle=5
    spring.datasource.initial-size=5
    spring.datasource.validationQuery=select 'x'
     

8、启动SpringbootquartzApplication看结果:三个job都按照配置的调度时间执行

    TaskJobBean(jobName=jobA, jobClassName=com.cn.dl.task.JobA, jobCron=0/5 * * * * ? *)
    2018-12-11 14:04:46.168  INFO 41948 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
    TaskJobBean(jobName=jobB, jobClassName=com.cn.dl.task.JobB, jobCron=0 0 04 * * ? *)
    2018-12-11 14:04:46.170  INFO 41948 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
    TaskJobBean(jobName=jobC, jobClassName=com.cn.dl.task.JobC, jobCron=0/30 * * * * ? *)
    2018-12-11 14:04:46.172  INFO 41948 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
    JobA>>>>>>Tue Dec 11 14:04:50 CST 2018
    JobA>>>>>>Tue Dec 11 14:04:55 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:00 CST 2018
    JobC>>>>>>Tue Dec 11 14:05:00 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:05 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:10 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:15 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:20 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:25 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:30 CST 2018
    JobC>>>>>>Tue Dec 11 14:05:30 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:35 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:40 CST 2018
    JobA>>>>>>Tue Dec 11 14:05:45 CST 2018

以上就是springBoot和Quartz整合的小案例,里面还有很多细节问题需要注意(不能共享我们实际生产的源代码,请见谅),但是大体流程还是可以借鉴的,毕竟经过实践验证。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值