• Spring Boot 整合 Quartz 轻松实现任务调度!


    来源:gyoomi.blog.csdn.net/article/details/83382000

    一、引言

    定时任务调度是Java开发中不可或缺的重要部分,但是Java自带的Time等任务调度类在实际项目中不好用。所以Quartz和Spring Task就成了我们项目开发技术选型最多的,在这里我们着重探讨一下Quartz在Spring Boot 2.X版本中的使用。

    二、Quartz

    1. 介绍

    Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。

    Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

    Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

    2.安装配置

    官方网站:

    ❝ http://quartz-scheduler.org/ ❞

    3.设计架构

    介绍

    • Scheduler – 核心调度器
    • Job – 任务
    • JobDetail – 任务描述
    • Trigger – 触发器

    图示

    多个定时的图示如下:

    对比下配置xml中的配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
        <!-- 
            Spring整合Quartz进行配置遵循下面的步骤:
            1:定义工作任务的Job
            2:定义触发器Trigger,并将触发器与工作任务绑定
            3:定义调度器,并将Trigger注册到Scheduler
         -->
        <!-- 1:定义任务的bean ,这里使用JobDetailFactoryBean,也可以使用MethodInvokingJobDetailFactoryBean ,配置类似-->
        <bean name="hwJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <!-- 指定job的名称 -->
            <property name="name" value="hw_job"/>
            <!-- 指定job的分组 -->
            <property name="group" value="hw_group"/>
            <!-- 指定具体的job类 -->
            <property name="jobClass" value="com.dufy.spring.quartz.chapter01.job.HelloWorldJob"/>
            <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中会删除该任务  -->
            <property name="durability" value="true"/>
            <!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
            <property name="applicationContextJobDataKey" value="applicationContext"/>
        </bean>
        <!-- 2.1:定义触发器的bean,定义一个Simple的Trigger,一个触发器只能和一个任务进行绑定 -->
        <!-- <bean name="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
            指定Trigger的名称
            <property name="name" value="hw_trigger"/>
            指定Trigger的名称
            <property name="group" value="hw_trigger_group"/>
            指定Tirgger绑定的Job
            <property name="jobDetail" ref="hwJob"/>
            指定Trigger的延迟时间 1s后运行
            <property name="startDelay" value="1000"/>
            指定Trigger的重复间隔  5s
            <property name="repeatInterval" value="5000"/>
            指定Trigger的重复次数
            <property name="repeatCount" value="5"/>
        </bean> -->
    
        <!-- 2.2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
        <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <!-- 指定Trigger的名称 -->
            <property name="name" value="hw_trigger"/>
            <!-- 指定Trigger的名称 -->
            <property name="group" value="hw_trigger_group"/>
            <!-- 指定Tirgger绑定的Job -->
            <property name="jobDetail" ref="hwJob"/>
            <!-- 指定Cron 的表达式 ,当前是每隔1s运行一次 -->
            <property name="cronExpression" value="0/1 * * * * ?" />
        </bean>
    
    
        <!-- 3.定义调度器,并将Trigger注册到调度器中 -->
        <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <!-- <ref bean="simpleTrigger"/> -->
                    <ref bean="cronTrigger"/>
                </list>
            </property>
            <!-- <property name="autoStartup" value="true" /> -->
        </bean>
    
    </beans>

    三、整合

    1.项目基础

    项目是基于Spring Boot2.x版本的。

    2.添加依赖

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

    3.yml配置

    application-quartz.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
        #初始化表结构
        #jdbc:
          #initialize-schema: never

    4.创建任务测试类

    简单任务

    代码如下:

    public class MyJob extends QuartzJobBean {
    
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("start My Job:" + LocalDateTime.now());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("end  My Job:" + LocalDateTime.now());
    
        }
    }

    CRON任务

    public class MyCronJob extends QuartzJobBean {
    
        @Autowired
        IndexController indexController;
    
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("任务执行了" + new Date());
            // indexController.testMail();
        }
    }

    5.Java配置(QuartzConfiguration)

    @Configuration
    public class QuartzConfiguration {
    
     // 使用jobDetail包装job
        @Bean
        public JobDetail myJobDetail() {
            return JobBuilder.newJob(MyJob.class).withIdentity("myJob").storeDurably().build();
        }
    
     // 把jobDetail注册到trigger上去
        @Bean
        public Trigger myJobTrigger() {
            SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(15).repeatForever();
    
            return TriggerBuilder.newTrigger()
                    .forJob(myJobDetail())
                    .withIdentity("myJobTrigger")
                    .withSchedule(scheduleBuilder)
                    .build();
        }
    
     // 使用jobDetail包装job
        @Bean
        public JobDetail myCronJobDetail() {
            return JobBuilder.newJob(MyCronJob.class).withIdentity("myCronJob").storeDurably().build();
        }
    
     // 把jobDetail注册到Cron表达式的trigger上去
        @Bean
        public Trigger CronJobTrigger() {
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
    
            return TriggerBuilder.newTrigger()
                    .forJob(myCronJobDetail())
                    .withIdentity("myCronJobTrigger")
                    .withSchedule(cronScheduleBuilder)
                    .build();
        }
    }

    其实上面的配置就等价于在传统的xml中配置bean是一样的。

    6.启动测试

    至此,SpringBoot集成Quartz的完毕。

    四、总结

    Spring Boot集成quartz还是比较简单的。

    其实还有更高级的用法,就是前台动态创建和控制定时任务,后面有时间再完善。大家先把这种最简单的基本用法熟练掌握。

    源码

    • https://github.com/gyoomi/framework

    来源:https://mp.weixin.qq.com/s/4UA1SsTawK-H9jDNmTubOg

  • 相关阅读:
    使用zoom.js设置博客园图片放大缩小
    js中变量对象和活动对象的区别 闭包时的区别
    总结Unity 初学者容易犯的编译与运行时错误
    三天之后的「数」下英雄会是个什么会?
    奇点云数据中台技术汇(十)| 数据服务,让业务开发更敏捷
    湖畔论剑 | 一封“数”下英雄会的神秘邀请函
    12月5日,「数据中台建设之道」线上开聊
    StartDT AI Lab | 视觉智能引擎之算法模型加速
    贵州茅台集团一行考察奇点云,探讨酒业数智化转型
    何夕:如何让实体商家拥有淘宝一样的数据化运营能力
  • 原文地址:https://www.cnblogs.com/konglxblog/p/15758861.html
Copyright © 2020-2023  润新知