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 *
- Spring定时任务配置quartz
- spring quartz 定时任务配置
- Spring+Quartz配置定时任务
- Spring配置Quartz定时任务
- Spring+Quartz配置定时任务
- spring quartz配置定时任务
- Spring+Quartz配置定时任务
- spring定时任务Quartz多任务配置
- Quartz定时任务,Quartz Spring定时任务,spring多个定时任务Quartz配置,示例,详解
- Spring 配置Quartz 定时任务调度服务
- spring多个定时任务quartz配置
- spring多个定时任务quartz配置
- Spring定时任务配置详解 quartz cronExpression
- Spring Quartz 动态配置定时任务
- spring quartz自动定时任务配置
- Spring配置quartz定时调度任务
- spring quartz 配置多个定时任务
- Spring Quartz 动态配置定时任务
- 项目 2 建设“单链表”算法库
- maven环境快速搭建
- 微信小程序来了,难道他的概念不是在偷取微软云应用吗?
- socket实现客户端和客户端之间通信和聊天
- 浏览器渲染页面的过程,以及重绘和重排
- Spring配置Quartz定时任务
- 2016-9-19
- 各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK详解
- 2016-9-20
- noip2013 货车运输
- Jquery 判断对象类型的值是否为空
- Android全面的网络工具方法
- 验证码的生成
- IO流