Quartz是一个任务进度管理器,可以与任何其他软件系统集成或者一起使用。是用一个小Java库发布的文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
以top调用错误统计定时发送邮件任务为例介绍Quartz定时任务的Spring依赖注入配置方法:
1.定时目标类TaoReportTask的bean配置(详见eshop/eshop/src/bean/spring-app-task.xml)。
<bean id="taoReportTask" class="com.alibaba.eshop.task.tool.task.TaoReportTask">
<property name="taskHost">
<!—执行任务的服务器的ip -->
<value>${task.taoreport.ip}</value>
</property>
<property name="manager">
<ref bean="manager"/>
</property>
<property name="mailSender" ref="mailSender" />
</bean>
2.Scheduler的配置(详见eshop/neweshop/src/spring/spring-task-quartz.xml),Scheduler包含一个Trigger列表,每个Trigger表示一个作业。
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"autowire="no">
<property name="triggers">
<list>
<!-- 淘宝错误统计作业-->
<ref bean="doTaoReportTrigger"></ref>
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>
3.Trigger的配置(详见eshop/eshop/src/bean/spring-app-task.xml)。
<bean id="doTaoReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="doTaoReportJobDetail"/>
</property>
<property name="cronExpression">
<!—Cron表达式,表示每天凌晨执行一次任务 -->
<value> 0 0 0 * * ?</value>
</property>
</bean>
说明:
1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 允许的值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日 1-31 , - * ? / L W C
月 1-12 or JAN-DEC , - * /
周几 1-7 or SUN-SAT , - * ? / L C #
年 (可选字段) empty, 1970-2099 , - * /
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
2)Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
4. JobDetail配置(详见eshop/eshop/src/bean/spring-app-task.xml),其中C2CMethodInvokingJobDetailFactoryBean 继承了spring中的
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean。
<bean id="doTaoReportJobDetail"
class="com.alisoft.c2c.aop.C2CMethodInvokingJobDetailFactoryBean">
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
<property name="concurrent">
<value>false</value>
</property>
<!—任务目标类 -->
<property name="targetObject">
<ref bean="taoReportTask" />
</property>
<!—任务目标类要调用的方法-->
<property name="targetMethod">
<value>doTopReport</value>
</property>
</bean>