Spring环境集成Quartz实现定时任务

一、前提

本文实现前提是已经实现一个SSM的环境,可参考:搭建SSM框架

二、目录结构

quartz新增文件目录位置

三、pom.xml

引入quartz的jar包

<!-- quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

四、spring-config.xml

在spring的配置文件中引入quartz的配置文件,使得quartz中的bean给spring管理

<!-- 引入quartz定时任务的配置文件 -->
<import resource="quartz-*.xml"/>

五、四种情况

quartz中包含两种触发器Trigger以及两种任务JobDetail。

两种触发器为:SimpleTriggerFactoryBean简单触发器,指定定时任务的开始时间以及间隔时间。CronTriggerFactoryBean为cron表达式触发器,通过cron表达式的方式指定定时任务执行的具体年月日时分秒。

两种JobDetail:MethodInvokingJobDetailFactoryBean指定定时任务的执行类与执行方法,通过反射来实现定时任务的调度。JobDetailFactoryBean没有指定定时任务的执行方法,只指定了定时任务的实现类,因此需要实现类继承QuartzJobBean抽象类来实现默认方法,或实现Job接口实现默认方法。定时任务调度时执行默认方法中的实现即可。

需要注意的是,在低版本的quartz中,也就是比较老的java项目中,触发器Trigger和JobDetail可能没有中间的Factory这个单词,说明在低版本的quartz没有使用工厂模式,在高版本中进行了优化。因此当低版本的quartz参考如下案例会导致报错。

以下为他们两两结合组成的四种实现情况。

1、MethodInvokingJobDetail…与CronTrigger…的实现
(1)定时任务类
package com.ykq.task;

/**
 * @author: kqyin
 * @date: 2021/11/23 10:03
 * @Description: 通过方法反射方式,使用cron表达式的定时任务
 */
public class MethodInvokeCronTask {
    public void execute(){
        System.out.println("1.MethodInvokeCronTask demo start ...");
    }
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 任务1配置 -->
    <bean name="methodInvokeCronTask" class="com.ykq.task.MethodInvokeCronTask"/>

    <bean id="methodInvokeCronJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 执行的类 -->
        <property name="targetObject">
            <ref bean="methodInvokeCronTask" />
        </property>
        <!-- 类中的方法 -->
        <property name="targetMethod">
            <value>execute</value>
        </property>
    </bean>
    <bean id="methodInvokeCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="methodInvokeCronJobDetail" />
        </property>
        <!-- 每一秒钟执行一次 -->
        <property name="cronExpression">
            <value>0/1 * * * * ?</value>
        </property>
    </bean>

    <!-- 总配置 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 添加触发器 -->
        <property name="triggers">
            <list>
                <ref bean="methodInvokeCronTrigger" />
            </list>
        </property>
    </bean>
</beans>
2、MethodInvokingJobDetail…与SimpleTrigger…的实现
(1)定时任务类
package com.ykq.task;

/**
 * @author: kqyin
 * @date: 2021/11/23 10:17
 * @Description: 通过方法反射方式,使用SimpleTrigger的定时任务
 */
public class MethodInvokeSimpleTask {
    public void execute(){
        System.out.println("2.MethodInvokeSimpleTask demo start ...");
    }
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 任务2配置 -->
    <bean name="methodInvokeSimpleTask" class="com.ykq.task.MethodInvokeSimpleTask"/>

    <bean id="methodInvokeSimpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 执行的类 -->
        <property name="targetObject">
            <ref bean="methodInvokeSimpleTask" />
        </property>
        <!-- 类中的方法 -->
        <property name="targetMethod">
            <value>execute</value>
        </property>
    </bean>
    <bean id="methodInvokeSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="methodInvokeSimpleJobDetail" />
        </property>
        <property name="startDelay" value="5000"/>
        <property name="repeatInterval" value="5000"/>
    </bean>

    <!-- 总配置 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 添加触发器 -->
        <property name="triggers">
            <list>
                <ref bean="methodInvokeSimpleTrigger" />
            </list>
        </property>
    </bean>
</beans>
3、JobDetail…与CronTrigger…的实现
(1)定时任务类
package com.ykq.task;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * @author: kqyin
 * @date: 2021/11/23 10:28
 * @Description: 无方法反射,使用cron表达式的定时任务
 */
public class NoMethodInvokeCronTask extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("3.NoMethodInvokeCronTask demo start ...");

    }
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 任务3配置 -->
    <bean id="noMethodInvokeCronJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 执行的类 -->
        <property name="jobClass" value="com.ykq.task.NoMethodInvokeCronTask"/>
    </bean>
    <bean id="noMethodInvokeCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="noMethodInvokeCronJobDetail" />
        </property>
        <!-- 每一秒钟执行一次 -->
        <property name="cronExpression">
            <value>0/1 * * * * ?</value>
        </property>
    </bean>

    <!-- 总配置 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 添加触发器 -->
        <property name="triggers">
            <list>
                <ref bean="noMethodInvokeCronTrigger" />
            </list>
        </property>
    </bean>
</beans>
4、JobDetail…与SimpleTrigger…实现
(1)定时任务类
package com.ykq.task;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * @author: kqyin
 * @date: 2021/11/23 10:28
 * @Description: 无方法反射,使用SimpleTrigger的定时任务
 */
public class NoMethodInvokeSimpleTask extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("4.NoMethodInvokeSimpleTask demo start ...");
    }
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 任务4配置 -->
    <bean id="noMethodInvokeSimpleJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 执行的类 -->
        <property name="jobClass" value="com.ykq.task.NoMethodInvokeSimpleTask"/>
    </bean>

    <bean id="noMethodInvokeSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="noMethodInvokeSimpleJobDetail" />
        </property>
        <property name="startDelay" value="5000"/>
        <property name="repeatInterval" value="5000"/>
    </bean>

    <!-- 总配置 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 添加触发器 -->
        <property name="triggers">
            <list>
                <ref bean="noMethodInvokeSimpleTrigger" />
            </list>
        </property>
    </bean>
</beans>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值