在项目中,定时实现某个任务是经常遇到的事情。在企业级的项目中,Quartz这一框架能够很好的帮我们完成定时任务。Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。该项目已经被 Terracotta收购。
下面就总结下自己对Quartz使用的简单总结。在spring使用Quartz有两种方法:继承QuartzJobBean与使用MethodInvokingJobDetailFactoryBean。我们项目中使用的是第一种方法,下面的总结也是使用第一种方法实现的。至于这两种使用方法的区别暂时还没有查阅相关资料。
第一步:新建一个job类名为:QuartzDemoJob,该类代码如下:
package com.joyun.quartz;
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class QuartzDemo extends QuartzJobBean {
private JobData jobData; //JobData为自定义类
@Override
public void executeInternal(JobExecutionContext context){
System.out.println(jobData.getData()+" is executed");
}
public JobData getJobData() {
return jobData;
}
public void setJobData(JobData jobData) {
this.jobData = jobData;
}
}
继承的QuartzJobBean类来自org.springframework.scheduling包,在我们的工程需要导入quartz.jar包。在executeInternal方法中可能会抛出JobExecutionException。
JobData类代码如下:
package com.joyun.quartz.bean;
import java.util.Date;
public class JobData {
public String getData(){
return "Data from JobData at "+new Date().toString();//输出当前时间
}
}
第二步:配置相关xml文件。
为了方便模块管理,我们把定时任务的配置文件单独列出来,如我们可以新建一个timer.xml的文件,在该文件中对其进行配置。timer.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<bean id="jobData" class="cm.joyun.bean.JobData"></bean>
<bean id="jobDetailBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.joyun.Qquartz.QuartzDemoJob"></property>
<property name="jobDataAsMap">
<map>
<entry key="jobData" value-ref="jobData"></entry>
</map>
</property>
</bean><bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetailBean"></property>
<property name="cronExpression" value="0 37-38 15 * * ?"/><!--value表示任务具体的触发执行时间-->
</bean>
<bean id="scheduledFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
该配置文件在web.xml配置文件中对spring进行配置的时候加上该文件即可。
附任务触发时间的写法说明:
"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触发