Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz。
首先,感谢刘波老师,提供了个例子给我学习。
需要导入的类库(这里用的是Spring2.5):
1.Spring 2.5 Core Libraries
2.Spring 2.5 Misc Libraries
3.Spring 2.5 AOP Libraries
一、被调度的类:
package org.newboy.biz; import java.sql.Timestamp; import java.util.Date; /** * 需要定时运行的方法 * * @author newboy * */ public class BusinessReport { // 初始一数字变量 static long count = 0; /** * 被调度的方法 */ public void perform() { count++; System.out.println(new Timestamp(new Date().getTime()) + " count=" + count); } }
二、Spring的配置文件:
<?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 我的业务类 --> <bean id="businessReport" class="org.newboy.biz.BusinessReport" /> <!-- 定义目标bean和bean中的方法 --> <bean id="reportTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 相应的类 --> <property name="targetObject" ref="businessReport" /> <!-- 相应的方法 --> <property name="targetMethod" value="perform" /> <property name="concurrent" value="false" /> </bean> <!-- 配置触发器,触发器加载哪些job,定义触发的时间 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="reportTask" /> <!-- 设置cron表达式 --> <property name="cronExpression" value="0-59 * * * * ?" /> </bean> <!-- 配置quartz调度,指定加载哪些触发器 --> <bean id="startScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean> </beans>
三、测试类:
package org.newboy.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 测试类 * @author newboy * */ public class TestBiz { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }
四、放入log4j.properties文件到src目录下
五、放入cron表达式.txt文件到src目录下,然后运行Main函数就OK了。
关于cron表达式(来自网络)
Cron表达式包括以下 7 个字段:
1.秒
2.分
3.时
4.月
5.月内日期
6.周内日期
7.年(可选字段)
六、Cron表达式的一些解释:
cronExpression格式说明 表达式: Seconds Minutes Hours Day-of-month Month Day-of-Week Year 说明: 表达式由6个或7个字符串组成,字符之间用空格分隔;前6个为必选项,year为可选项; 字符串的取值不区分大小写; 允许的值和特殊字符可单独使用或组合使用; 星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都触发。 整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。 用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。 正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月触发一次。 问号(?)表示不指定任何值,主要用于day of month 和day of week,当指定其中一个值的时候,另一个设置为问号,避免前后不一致。 L表示最后一天, 主要用于day of month 和day of week,每月的最后一天,每周的最后一天,用于day of month 时只能单独使用,用于day of week时可以组合使用,例如6L, 表示指定月的最后一个星期五. W用于day of month, 表示离指定日期最近的工作日(周一至周五), 例如6W,如果这个月的第6天为周六,则表示周五(这个月的第5天);如果第6天为周日,则表示周一(这个月的第7天);如果第6天为工作日,则为当日;如果按正常推算的日期为上月或下月,则在本月内查找最近的工作日; LW组合使用表示这个月的最后一个工作日; #用于day of week, #号后面跟数字n表示本月的第n个X., 例如6#3 表示指定月的第三个星期五; 举例: 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触发
七、demo