Spring+Quartz配置定时任务
一、Quartz介绍
在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等。Quartz是出了名的任务调度框架,它可以与J2SE和J2EE应用程序相结合,功能灰常强大,轻轻松松就能与Spring集成,使用方便。
二、Quartz中的概念
主要有三个核心概念:调度器、任务和触发器。三者关系简单来说就是,调度器负责调度各个任务,到了某个时刻或者过了一定时间,触发器触动了,特定任务便启动执行。概念相对应的类和接口有:
1)JobDetail:望文生义就是描述任务的相关情况;
2)Trigger:描述出发Job执行的时间触发规则。有SimpleTrigger和CronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。
3)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。
三、Spring中使用Quartz
1,所需jar包:quartz.jar,spring-context-support.jar,commons-collections-3.2.jar;
2,添加业务逻辑类(简单示例):
public class QuartzTest { //到了某个时刻就会被调用 public void autoRun(){ System.out.println("It's time to run :" + new Date().toString()); //TODO 执行任务逻辑 //........ } }
3,配置文件:
a)SimpleTrigger方式:
<!-- Quartz --> <bean name="quartzTest" class="com.jz.schedual.QuartzTest" /> <bean id="quartzTestJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzTest"></property> <property name="targetMethod" value="autoRun"></property> <!-- 到时未完成,后面的任务推迟,并在前一个完成后立即开始 --> <property name="concurrent" value="false"></property> </bean> <bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="quartzTestJob"/> <!-- 20秒后运行 --> <property name="startDelay" value="20000" /> <!-- 每隔三十秒重复 --> <property name="repeatInterval" value="30000" /> </bean> <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="quartzTestTrigger" /> </list> </property> </bean>
b)CronTrigger方式:在spring配置文件中定义各种bean:
<!-- Quartz --> <bean name="quartzTest" class="com.jz.schedual.QuartzTest" /> <bean id="quartzTestJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzTest"></property> <property name="targetMethod" value="autoRun"></property> <!-- 设定多个job不会并发运行 --> <property name="concurrent" value="false"></property> </bean> <bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="quartzTestJob"/> <!-- 每天十点 --> <property name="cronExpression" value="0 0 10 * * ?"></property> </bean> <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="quartzTestTrigger" /> </list> </property> </bean>
四、Cron表达式
cronExpression定义时间规则,Cron表达式由6或7个空格分隔的时间字段组成:秒 分钟 小时 日期 月份 星期 年(可选);
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 , - * /
星期 1-7 , - * ? / L C #
年 1970-2099 , - * /
解析:
0/5 * * * * ? : 每5秒执行一次
“*”字符被用来指定所有的值。如:"*"在分钟的字段域里表示“每分钟”。
“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号来表明不想设置那个字段。
“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。
“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。
“/”字符用于指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。“5/15”在分钟域表示每小时的5,20,35和50。 符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)。记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如: 秒域和分钟域的集合是0-59,日期域是1-31,月份域是1-12。字符“/”可以帮助你在每个字符域中取相应的数值。如:“7/6”在月份域的时候只 有当7月的时候才会触发,并不是表示每个6月。
L是‘last’的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of- month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示 一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五。
字符“W”只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果 是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个 单独的数值使用,不能够是一个数字段,如:1-15W是错误的。
“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。
字符“#”只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三。
字符“C”允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历” 关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历” 中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。
例子如下:
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"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触发
五,动态配置定时任务
有时,我们会碰到这样的问题:需要修改触发器的触发时间,那么就要修改spring配置文件,再重启服务器,但是有很多时候我们没有条件去重启服务器;或者,有特定的需求,需要前台直接修改调度时间。这时候我们就要动态设置触发时间。详细配置请参考文章:http://ithead.iteye.com/blog/1460748
最后说一下,我们可以通过Quartz完整下载包中的Examples来快速学习使用掌握Quartz。
相关推荐
总结,通过以上步骤,我们就成功地在Spring 3中配置了Quartz定时任务,实现了每10秒执行一次的任务。在实际应用中,你可以根据需求定义更复杂的作业和触发器,以及使用Quartz的其他高级特性,如集群支持、持久化作业...
在Spring框架中,定时任务是常见的需求,例如用于执行定期数据同步、日志清理或发送邮件等。...通过理解Quartz的工作原理和Spring的定时任务API,我们可以有效地管理定时任务,确保它们按预期执行。
Quartz 则是一款强大的作业调度框架,它允许开发者在 Java 应用中实现定时任务的调度功能。通过将两者结合使用,可以更好地管理定时任务,并充分利用 Spring 的特性。 #### 二、Spring与Quartz的整合概述 整合 ...
4、可以对该demo工程进行扩展,实现在页面上定义任务开始执行时间、循环次数等。 4、附件中包含完整demo工程(包含数据库建表语句,插入语句); 5、该功能仅次于quartz; 6、更多jcrontab相关知识,请在网上搜索,...
### Quartz 动态实现数据库任务的关键知识点 #### 一、Quartz 概述与应用场景 Quartz 是一个全面开源的任务调度框架,它提供了强大的任务调度功能。Quartz 不仅能够定义简单或复杂的循环任务,还支持多种触发机制...
通过对题目中提供的信息进行分析,我们可以了解到如何利用 Spring 与 Quartz 进行集成,从而实现 Tomcat 启动时调用 Quartz 执行一次任务的需求。通过合理配置 `SchedulerFactoryBean`、`CronTriggerBean` 和 `...
常见的几种定时任务实现 创建一个thread,然后让它在while循环里一直运行着, 通过sleep方法来达到定时任务的效果 JDK自带的Timer API算是最古老的定时任务实现方式了。Timer是一种定时器工具,用来在一个后台线程...
### 配置Spring+Quartz定时器的知识点详解 #### 一、Quartz简介与应用场景 Quartz 是一个开源的任务调度框架,它...通过上述步骤,我们可以有效地在Spring环境中配置并使用Quartz定时器,实现灵活的任务调度功能。
选择合适的定时任务实现方式,结合实际需求和系统环境,可以充分利用其优势,规避潜在风险,提升软件的自动化水平和效率。在实际开发中,应根据项目规模、复杂度和团队能力来决定采用哪种定时任务实现方案。
#### 四、定时任务实现类 定时任务的具体实现通常需要继承 `QuartzJobBean` 或实现 `Job` 接口。 ```java package cn.xg.spring; import org.quartz.JobExecutionContext; import org.quartz....
Timer类可以用来实现简单的定时任务,例如执行一次或循环执行任务。例如: ``` Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("2000毫米后...
接下来,我们探讨Spring框架中的定时任务实现: 1. ScheduledTimerTask:Spring的ScheduledTimerTask允许定义任务执行的频率,但无法精确控制任务的启动时间。通常,ScheduledTimerTask适合简单任务,但若需更精确...
例如,可以在 `init()` 方法中使用 `Timer` 或者使用 Servlet 容器支持的定时任务机制,如Quartz Scheduler 或 Spring 的 `@Scheduled` 注解。这种方式更适用于企业级应用,因为它能够更好地集成到现有的应用环境中...
3. **Spring Context**: `spring-context.jar` 建立在Spring Beans之上,提供了更丰富的上下文环境,支持国际化、事件传播、AOP(面向切面编程)以及与第三方库的集成,如Quartz定时任务或JMX管理。 4. **Spring ...
综上所述,这个基础框架集合了Spring Boot的便利性、MyBatis的灵活性、Shiro的安全管理、代码生成器的自动化、Quartz的定时任务调度以及Thymeleaf的模板渲染,为开发人员提供了一个全方位的工具链,使得企业级应用的...
4. **应用程序集成**:在某些业务系统中,可以通过编写后台服务或工作流引擎来实现定时任务,例如Spring Boot结合Spring Schedule库。 5. **云服务**:许多云平台提供了定时任务服务,如AWS的CloudWatch Events或...
7. 定时任务:Quartz或Spring Task可用于实现后台定时任务,如库存检查、订单超时提醒等。 8. 缓存机制:Spring Boot支持多种缓存解决方案,如Redis,可以提高数据读取效率。 9. 负载均衡和微服务:如果系统采用...
它也支持集成其他框架,如Quartz定时任务、JMS消息服务等。 7. **spring-aop-4.3.0.RELEASE.jar**:与spring-aspects相关,它提供了面向切面编程的基础,包括定义切面、通知类型和自动代理生成。 8. **spring-web-...
`java.util.concurrent.ScheduledExecutorService`是更高级的定时任务实现,基于线程池设计,允许多个任务并发执行。通过`scheduleAtFixedRate()`方法可以设置任务的执行周期,更加灵活且高效。 4. **Quartz** ...
Spring支持Quartz,可以方便地在Spring应用中配置和管理定时任务。 9. **jruby**:JRuby是Java平台上的Ruby解释器,允许使用Ruby语法编写Java应用。Spring支持动态语言,包括JRuby,提供更灵活的编程模型。 10. **...