Spring配置Quartz定时任务

来源:互联网 发布:无线网络规划与优化 编辑:程序博客网 时间:2024/05/16 07:53

最近在做一个系统,要求每天定时地执行相关代码来计算一些数据存到数据库。在实际线上系统中,免不了要定时地执行一些任务,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等。Quartz是出了名的任务调度框架,它可以与J2SE和J2EE应用程序相结合,功能非常强大,轻轻松松就能与Spring集成,使用方便。这里简单总结一下Spring的定时任务配置。

主要有三个核心概念:调度器、任务和触发器。三者关系简单来说就是,调度器负责调度各个任务,到了某个时刻或者过了一定时间,触发器触动了,特定任务便启动执行。概念相对应的类和接口有:

  1)JobDetail:描述任务的相关情况;

  2)Trigger:描述出发Job执行的时间触发规则。有SimpleTrigger和CronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。

  3)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。

1、准备依赖的特殊jar包:quartz.jar,spring-context-support.jar,commons-collections.jar;
2、Spring配置文件xml:

<?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:tx="http://www.springframework.org/schema/tx"    xmlns:task="http://www.springframework.org/schema/task"    xsi:schemaLocation="    http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd    http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    http://www.springframework.org/schema/task     http://www.springframework.org/schema/task/spring-task-3.0.xsd">    <!-- 系统定时任务工厂类 -->    <bean id="systemDescsionScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    <property name="triggers">            <list>                 <ref bean="tcBackZcTask"/><!-- 定时任务配置到工厂 -->            </list>        </property>        <property name="quartzProperties">            <props>                <prop key="org.quartz.threadPool.threadCount">4</prop><!-- 开启线程数量 -->            </props>        </property>    </bean>    <!-- 任务配置信息 -->        <bean id="baseLogic" class="com.common.service.logic.BaseLogicImpl"><!-- 配置要调用的logic -->        <property name="baseDao">            <ref bean="baseDao"/>        </property>    </bean>    <bean id="baseDao" class="com.common.service.dao.hibernate.BaseDaoImpl"><!-- 配置要调用的DAO -->        <property name="sessionFactory">            <ref bean="sessionFactory"/>        </property>    </bean>    <!-- 定时任务-首 -->    <bean id="tcBackZcTask" class="org.springframework.scheduling.quartz.CronTriggerBean">        <property name="jobDetail">            <bean class="org.springframework.scheduling.quartz.JobDetailBean">                <property name="jobClass" value="com.collection.service.task.TcBackZcTask"/><!-- 配置定时任务执行类 -->                <property name="jobDataAsMap">                    <map>                        <entry key="baseLogic" ><!-- 定时任务类里面的对象变量名 -->                            <ref bean="baseLogic"/><!-- 引用注入 -->                        </entry>                    </map>                </property>            </bean>        </property>         <property name="cronExpression" value="00 00 08 * * ?"/> <!-- conExpression表达式,执行时间,以此为周期执行 例子意思为:每天8:00执行-->    </bean>                                                       <!-- 依次为:[秒] [分] [小时] [日] [月] [周] [年] -->    <!-- 定时任务-尾 --></beans>

3、任务执行类:

public class TcBackZcTask extends QuartzJobBean{    private Log log = LogUtils.getLog(ConstantsApplication.P2PAPPLICATION_LOG);    BaseLogicInterface baseLogic;    public BaseLogicInterface getBaseLogic() {        return baseLogic;    }    public void setBaseLogic(BaseLogicInterface baseLogic) {        this.baseLogic = baseLogic;    }    @Override    protected void executeInternal(JobExecutionContext arg0)            throws JobExecutionException {        log.info("定时任务--开始");        try {            //            //            //要定时执行的任务代码            //            //            log.info("定时任务--结束");        } catch (APSException e) {            e.printStackTrace();        }    }}

4、解决任务在Tomcat下每次执行两次的问题:
将Tomcat下server.xml 相应代码改成:

 <Host name="localhost"  appBase="webroot" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="../webapps/crf_p2p_clsp" debug="0" reloadable="true"/>

5.附录:con表达式

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
表达式意义
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? *” 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
每天早上6点
0 6 * * *
每两个小时
0 /2 * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *

0 0