• 基于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就是这么简单...眨眼

  • 相关阅读:
    iphone, iphone4, ipad 图标和背景图片问题(转)
    ios项目icon和default图片命名规则 (转)
    ios判断设备是iphone还是ipad
    cocos2d学习(一)helloWorld
    判断设备是否是 iphone5
    字节对齐(转)
    NSArray排序
    C++复习之运算符重载,数组排序,vector
    socket编程(转)
    win32下的socket编程
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7401472.html
Copyright © 2020-2023  润新知