使用Spring配置quartz(逻辑清晰)

本文详细介绍如何使用Spring框架集成Quartz进行定时任务配置。从引入依赖、创建任务类、配置任务明细Bean、触发器及调度工厂等方面,清晰阐述了Spring集成Quartz的全过程。

一、前言

  看Spring源码蛮久了,现在使用Spring集成quartz,看能不能用所学的知识,给各位讲清楚spring集成quartz是怎么配置的!看网上好多文章都说,Spring配置quartz挺复杂的。

quarz,石英调度,一个第三方定时调度框架。

二、配置步骤

  Spring的作用是管理Bean,这句话可以概括Spring框架80%的功能。我们使用Spring集成一个第三方框架时,无非就是把需要new的对象,配置到Spring IOC工厂而已。

1. 引入依赖

使用任何一个第三方的框架,都要引入依赖,这个没啥说的。

        <!--quartz核心包-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.2</version>
        </dependency>
        <!--spring与quartz集成要用到的支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>
2. 创建自定义的任务类
public class MyQuartzJob {
    public void executeMethod() {
        System.out.println("开始执行任务..."+ new Date());
    }
}

没错就是这么简单,在类中定义一个方法,这个方法就是你定时要执行的代码。
然后,把这个类交给Spring管理,你用注解或者配置到xml中都可以。我这里配置到xml中

<bean id="myQuartzJob" class="com.kaka.jtest.springboot.biz.scheduler.quartz.MyQuartzJob"/>

扩展:在quartz 1.x的时候自定义的任务类需要继承一个QuartzJobBean的抽象类,然后实现这个类的抽象方法。最后把这个自定义的任务类的全类名设置到JobDetailBean类的jobClass属性中,配置贼麻烦。最头痛的是这个自定义的任务类引用spring中管理的其他bean时(如自己写的userService),不能自动装配,需要通过JobDetailBean类的jobDataMap注入!

3. 配置quartz(重点!!!)

都说这一步复杂,是因为没理解quartz的运行原理。我们不扯太多内部实现,顺着大众的逻辑走一下就明白了。

3.1 配置任务明细Bean

我们上面的那个自定义的任务类,要让quartz帮忙执行的话,需要告诉quartz哪个类的哪个方法要定时执行吧?quartz中有个术语叫任务明细Bean,就是来包装你自定义的任务类的。

    <bean id="jobDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 指定任务bean -->
        <property name="targetObject" ref="myQuartzJob"/>
        <!-- 指定任务bean中的方法 -->
        <property name="targetMethod" value="executeMethod"/>
        <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
        <property name="concurrent" value="false"/>
    </bean>

1.x的时候更直白,直接叫JobDetailBean,任务明细Bean嘛~

3.2 配置触发器

quartz知道要调用哪个方法后,我们就需要继续告诉quartz什么时候调用了,这个就是触发器,也可以叫做触发策略。因为我们是用户,所以我们想怎么定时就怎么定时~

    <bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- a.设置调度的任务明细bean -->
        <property name="jobDetail" ref="jobDetailBean" />
        <!-- b.cron表达式:用空格分割的6到7位的字符串,我设置的每分钟的0,15,30,45秒执行-->
        <property name="cronExpression" value="0,15,30,45 * * * * ?"/>
    </bean>
3.3 配置调度工厂

上面两个配置好了,现在只差一个启动的入口了。这个入口就是调度工厂,当Spring容器启动时,就会通过这个SchedulerFactoryBean来启动触发器,进而执行我们自定义的定时任务。

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
        	<!-- 可以有多个 -->
            <list>
                <ref bean="cronTriggerBean"/>
            </list>
        </property>
    </bean>

可以看到,调度工厂中可以指定多个触发器。也就是3.1和3.2可以写多个,即我们可以自定义多个定时任务,并配置多个触发器
至此配置已完成!

三、运行

我是把配置bean的xml,都放到了other/quartz.xml文件中。Spring启动代码如下:

    @Test
    public void quartzTest() throws InterruptedException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "other/quartz.xml");
        System.out.println(applicationContext);
        TimeUnit.SECONDS.sleep(10000L);
    }

结果:在这里插入图片描述

符合预期~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值