zoukankan      html  css  js  c++  java
  • Spring Quartz 定时任务

    最近项目上需要用到定时任务,目前采用spring+quartz架构实现

    项目采用Maven管理

    需要依赖的Jar包如下

    quartz-1.8.5.jar 
    commons-logging.jar 
    spring-core-3.0.5.RELEASE.jar 
    spring-beans-3.0.5.RELEASE.jar 
    spring-context-3.0.5.RELEASE.jar 
    spring-context-support-3.0.5.RELEASE.jar 
    spring-asm-3.0.5.RELEASE.jar 
    spring-expression-3.0.5.RELEASE.jar 
    spring.transaction-3.0.5.RELEASE.jar 
    spring-web-3.0.5.RELEASE.jar 

    在Spring中使用Quartz有两种方式:

    ①任务继承QuartzJobBean

    ②在配置文件中定义需要执行的任务和方法

    考虑到需要动态更改任务的执行时间以及动态添加,这里采用第二种方式

    下面以项目上的例子作为展示(每隔20秒更新中间表数据)

    步骤如下:

    ①创建业务任务

    package cn.o.system.middletable.action;
    
    import java.io.UnsupportedEncodingException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    import cn.o.system.base.action.BaseAction;
    import cn.o.system.middletable.services.IMiddleTableServices;
    
    /**
     * @ClassName: MiddleTableAction
     * @Description: 中间表定时任务action层处理类
     * @author tate zhou
     * @date 2018-5-24
     * @version V1.0
     */
    
    @Component("scheduleAction")
    @Scope("prototype")
    public class MiddleTableAction extends BaseAction {
        private static final long serialVersionUID = 1L;
    
        @Autowired
        private IMiddleTableServices middleTableServicesImpl;
        
        
        /**************************************************** spring定时器刷新缓存执行方法 ****************************************************/
        
        /**
         * 
         * @方法:generateMidTableSchedule
         * @描述:间隔30秒对中间表数据全量更新
         * @param: MiddleTableAction
         * @author: tate zhou
         * @date :2018-5-17
         * @version: V1.0
         * @throws UnsupportedEncodingException
         */
        public void generateMidTableSchedule() {
            try {
                middleTableServicesImpl.generateMidTableData();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    }

    ②配置定时任务文件

    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>   
             <!-- Spring整合Quartz进行配置遵循下面的步骤: 
          1:定义工作任务的Job
          2:定义触发器Trigger,并将触发器与工作任务绑定
          3:定义调度器,并将Trigger注册到Scheduler
           --> <bean id="middleTableAction" class="cn.o.system.middletable.action.MiddleTableAction"></bean> <!-- 中间表数据更新任务定时生成 --> <bean id="generateMidTableTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="middleTableAction"/> </property> <property name="targetMethod"> <value>generateMidTableSchedule</value> </property> </bean> <!-- 配置一个触发器 --> <bean id="generateMiddleTableRecord" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="generateMidTableTask"/> </property> <property name="cronExpression"> <value>*/20 * * * * ?"</value> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="generateMiddleTableRecord"/> </list> </property> </bean> </beans>

    备注:设置定时任务时间的格式

    位置 - 含义­ 
    1 - 秒(0–59) 
    2 - 分(0–59) 
    3 - 时(0–23) 
    4 - 日(1–31) 
    5 - 月(1–12) 
    6 - 星期(SUN–SAT or 1–7) 
    7 - 年(可选, 1970–2099) 

  • 相关阅读:
    基于spark实现表的join操作
    关于IO的一些数字
    scala的REPL shell的调用
    搭建eclipse+maven+scala-ide的scala web开发环境
    Apache Mesos总体架构
    spark下测试akka的分布式通讯功能
    akka创建actor时报错:IllegalArgumentException: no matching constructor found on class $iwC$$iwC$$iwC$$iwC$
    akka构建简单分布式应用
    Memcached 工作原理
    分析Redis架构设计
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/9083161.html
Copyright © 2011-2022 走看看