spring与quartz的整合[通俗易懂]

spring与quartz的整合[通俗易懂]使用方法quartz是一个强大的任务调度框架,利用spring将其整合,添加较少的配置即可快速使用,主要步骤如下:0.导入需要的jar包或添加依赖,主要有spring-context-suppo

大家好,又见面了,我是你们的朋友全栈君。

使用方法

quartz是一个强大的任务调度框架,利用spring将其整合,添加较少的配置即可快速使用,主要步骤如下:

0. 导入需要的jar包或添加依赖,主要有spring-context-support、spring-tx、quartz;

1. 编写被调度类和被调度方法,即需要定时执行的类和方法;

2. 在spring容器中注册被调度类,单个注册或包扫描均可;

3. 在spring容器中注册作业类(MethodInvokingjOBdetailFactoryBean),并注入被调度类和被调度方法,一般每个被调度方法需要注册一个作业类;

4. 在spring容器中注册触发器,并注入对应的作业类和触发条件,一般每个作业类需要注册一个触发器;

触发器是用来指定被调度方法的执行时间的,根据触发条件的不同,有两个类可以选择:

(1) SimpleTriggerFactoryBean,只能指定间隔固定时长执行,例如每隔5秒钟执行一次;

(2) CronTriggerFactoryBean,既可以指定间隔固定时长执行,也可以指定某个或某几个时刻执行,例如每周三下午16点;

5. 在spring容器中注册调度工厂(ScheduerFactoryBean),并注入需要的触发器,可以注入一个或多个触发器。

 

示例Demo

被调度类和被调度方法 

/**
 * 使用quartz框架实现定时任务
 * 被调度类
 * created on 2019-04-20
 */
public class QuartzJob {

    /**
     * 定时方法,使用固定时长指定执行时间
     */
    public void doSimpleBusiness() {
        //业务逻辑省略,仅测试能执行方法
        System.out.println("----------quartz + 固定时长----------");
    }

    /**
     * 定时方法,使用cron表达式指定执行时间
     */
    public void doCronBusiness() {
        //业务逻辑省略,仅测试能执行方法
        System.out.println("----------quartz + cron表达式----------");
    }

}

 

spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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.xsd">

    <!--注册被调度类-->
    <bean id="quartzJob" class="cn.monolog.diana.quartz.QuartzJob" />

    <!--注册固定时长的作业类,并注入被调度类和被调度方法-->
    <bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="doSimpleBusiness" />
    </bean>

    <!--注册固定时长的触发器,并注入相应的作业类和间隔时间(单位为毫秒)-->
    <bean id="trigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail1" />
        <property name="repeatInterval" value="3000" />
    </bean>

    <!--注册cron表达式的作业类,并注入被调度类和被调度方法-->
    <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="doCronBusiness" />
    </bean>

    <!--注册cron表达式的触发器,并注入相应的作业类和cron表达式-->
    <bean id="trigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail2" />
        <property name="cronExpression" value="0/4 * * * * ?" />
    </bean>

    <!--注册调度工厂,并注入需要生效的触发器,注意最后autowire的配置-->
    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
        <property name="triggers">
            <list>
                <ref bean="trigger1" />
                <ref bean="trigger2" />
            </list>
        </property>
    </bean>

</beans>

 

踩过的坑

1. 一开始只是添加了spring-context-support和quartz依赖,结果服务启动失败,异常日志如下:

Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘schedulerFactory’ defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.scheduling.quartz.SchedulerFactoryBean]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: org/springframework/transaction/TransactionException
乍一看是因为初始化ScheduerFactoryBean失败,因为没有默认的构造器,后面又说是没有关于TransactionException的定义。但是我这个demo并没有用到事务,跟TransactionException有啥关系?暂时找不到内在联系,但是既然提示了,就加关于事务的依赖试一下。果然,添加了spring-tx的依赖之后,服务启动成功。至于为什么初始化ScheduerFactoryBean需要用到事务,待日后找到答案再来更新。

 

2. 一开始在配置文件中注册调度工厂并没有加autowire属性,启动服务时报错,无法启动quartz触发器,因为表不存在,异常日志如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘sm4_console.QRTZ_TRIGGERS’ doesn’t exist

参考了这位大神的博文https://www.cnblogs.com/gmq-sh/p/4328317.html,大概意思是quartz会使用数据库记录被调度类的状态,而数据库中并不存在这些日志表。解决方法就是在配置文件注册调度工厂时加autowire属性配置。

 

其他整合方案

除了上述,spring还提供了另外一种整合quartz的方案,即被调度类需要继承QuartzJobBean类,其他配置方式类似。

但是这种方案显然不如第一种灵活,因为被调度类需要继承固定的类,而Java又是单继承……

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154965.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月4日 上午7:00
下一篇 2022年7月4日 上午7:16


相关推荐

  • Source Insight 4.0 注册

    Source Insight 4.0 注册安装程序下载在官网上下载 SourceInsigh 0 的安装程序 30 天的试用安装首次启动选择授权方式 这里选择第二个选项 30 天试用 image png 点击下一步 输入名称 公司或组织名称 邮箱信息 申请 30 天的试用 输入完成后 点击下一步 直到安装完成 修改 sourceinsigh exe 用 16 进制编辑器 sublimetext 打开 sour

    2026年3月17日
    1
  • C++使用函数模板

    C++使用函数模板

    2022年1月16日
    48
  • 用Navicat连接MySQL的安装及配置

    用Navicat连接MySQL的安装及配置Nothingisimp 用 Navicat 连接 MySQL 的安装及配置步骤及所遇到问题安装 MySQL 一 下载 MySQL 二 下载完后文件内容三 配置系统的环境变量 Path 四 执行进入 MySQL 安装位置的 bin 目录命令 五 打开 Navicat 连接总结 用 Navicat 连接 MySQL 的安装及配置步骤及所遇到问题背景 由于电脑连续启动持续修复磁盘而不断重启 在网上找不到解决办法只好重置磁盘所重新配置环境之一的问题解决记录下来 如有更好的解决不断重启的问题的好方法求评论区告知 部分图片侵删此

    2026年3月18日
    1
  • pyqt5环境配置_pyqt5 has no attribute version

    pyqt5环境配置_pyqt5 has no attribute version前言小编从c++qt5入坑,再到PyQt5,发现这个pycharm与PyQt5的配置也比较复杂(相对于c++qt5)这篇文章就记录下自己怎么配置成功的,万一以后需要用到,就可以直接查了。文中所用的软件版本PyCharm2021.1.3(ProfessionalEdition),如果有出入,注意变通其他:网上现存的教程安装的都是pyqt5-tools,而且他们的软件界面也不一样。配置目录如下所示,会配置3个:QTdesigner:方便首次新建一个不存在的.ui文件PyUIC:

    2022年8月27日
    5
  • mysql之视图、索引

    mysql之视图、索引视图 什么是视图 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中。使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。 视图的作用 定制用户数据,聚焦

    2022年7月22日
    13
  • Elasticsearch系列——实战探索text与keyword的区别

    Elasticsearch系列——实战探索text与keyword的区别前言本文使用的工具是 kibana Linux Kibana 的安装与测试 在 elasticsearc x 版本 字符串数据只有 string 类型 ES 更新到 5 版本后 取消了 string 数据类型 代替它的是 keyword 和 text 数据类型那么 text 和 keyword 有什么区别呢 我们通过下面的步骤来探索一下 step1 添加数据首先 使用 bulk 往 es

    2026年3月5日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号