基于spring的quartz定时框架,实现简单的定时任务功能

在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作.

今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单.

首先需要配置一个配置文件,因为我是基于spring框架的,所以在spring的applicationContext.xml配置文件中,导入了另一个配置文件:

<!-- spring整合quartz框架 -->
<import resource="applicationContext-quartz.xml"/>

这是由于防止spring的applicationContext.xml过于臃肿,quartz框架的配置文件如下:

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa 
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!-- 配置job -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="site.wangxin520.quartz.PromotionJob"/>
    </bean>
    
    <!-- 配置触发方式 ,简单类-->
    <!-- <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        设置job
        <property name="jobDetail" ref="jobDetail"/>
        设置开始时间
        <property name="startDelay" value="0"/>
        设置多少毫秒重复执行 ,这里设置的是24h执行
        <property name="repeatInterval" value="6000"/>
    </bean> -->
    
    <!-- 定时任务 -->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 设置job -->
        <property name="jobDetail" ref="jobDetail" />
        <!-- 设置定时 -->
        <property name="cronExpression">
            <value>0 0 3 * * ?</value>
        </property>
    </bean>
    
    <!-- 设置job工厂 -->
    <bean name="jobFactory" class="site.wangxin520.quartz.JobFactory"></bean>
    
    <!-- 设置工作列表 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 设置job的工厂 -->
        <property name="jobFactory" ref="jobFactory"/>
        <!-- 设置触发器列表 -->
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>

        
</beans>

quartz定时框架,最重要的三个配置:job(任务),trigger(触发方式),工作列表.

job是所需的执行的操作,在job里面有一个filed即jobClass,这个jobClass类,就是执行的任务方法所在的类(后面详细讲).

trigger是触发方式,可以设置什么时间做什么事.

工作列表,就是一个job工厂,可以实现多触发方式,而每个触发方式里面又有一个任务,这就说明了工作列表就是一个带有触发方式的job任务的集合.

  • 在spring中,job工厂是需要自己创建的代码中橙色指向的class类就是自己创建的.代码为:
package site.wangxin520.quartz;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;

/**
 * 创建的定是框架的jobFactory
 * 文件名 : JobFactory.java
 * 包名     : site.wangxin520.quartz
 * 项目名 : wangxin520
 * 作者     : wangXgnaw
 */
public class JobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    
    /*
     * (重写接口的方法)
     * @see org.springframework.scheduling.quartz.AdaptableJobFactory#createJobInstance(org.quartz.spi.TriggerFiredBundle)
     */
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

这个类就是用来新建一个job工厂的.

  • 触发方式有两种
  1. 一种是定时间段来循环,(在配置中注销掉的一片就是定时间段,具体看注释)
  2. 另一种即使定固定时间点来执行,下述代码就是设置的固定时间点:
    <property name="cronExpression">
                <value>0 0 3 * * ?</value>
    </property>

其中顺序依次为 秒 分钟 小时 日 月 年

这几个值,如果除了年外,写*号就代表任意(任一),年写?号为任意,如果年写固定的,那就会是固定的年份去执行.在我的代码中,我写的意思是每天凌晨3点执行job任务.

这个具体可以见百度.

  • job工作任务
package site.wangxin520.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import site.wangxin520.service.BlogService;

public class PromotionJob implements Job {
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //需要执行的代码
    }
    
}

自定义的job任务,需要实现org.quartz.Job接口,重写exectue的方法.在这个方法里面,就可以写需要定时执行的代码了.

spring整合quartz就是这么简单...眨眼

原文地址:https://www.cnblogs.com/wangxinblog/p/7401472.html