标签:
最近项目中的定时批处理用到了quartz定时任务,在此记录下quartz的配置吧,一个小demo仅供参考,也方便自己今后复习!
下面直接来步骤吧!
一、首先,要搭起能让quartz正常运行的环境,至少需要三个jar包,spring.jar、quartz.jar、commons-logging.jar,各个jar包版本的话目前具体还不清楚有什么要求,欢迎补充!本人用的如下:
二、jar包引入完毕,写好自己需要执行的任务类,在此给出个简单的demo:
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class TestQuartz extends QuartzJobBean{
public void test(){
System.out.println("========="+System.currentTimeMillis()+"=========");
}
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
test();
}
}
注:任务类一定要继承QuartzJobBean类,实现其中的executeInternal方法。
三、进行xml的配置。xml配置时其任务bean的配置可用JobDetailBean,也可用MethodInvokingJobDetailFactoryBean。
JobDetailBean的配置方法如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 任务 --> <bean name="reportTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="TestQuartz" /> </bean> <!-- 触发器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- 指向我们的任务 --> <property name="jobDetail" ref="reportTask" /> <!-- 每30s触发一次 --> <property name="cronExpression" value="30 * * * * ?" /> </bean> <!-- 调度器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- 触发器列表 --> <ref bean="cronTrigger" /> </list> </property> </bean> </beans>
对于这个配置,个人的理解是调度器根据配置找到需要执行的触发器,触发器根据配置找到需要执行的任务,任务根据配置找到真正的类和方法去执行。
此配置,最终会执行TestQuartz的executeInternal方法,也就是重写的父类方法。
MethodInvokingJobDetailFactoryBean的配置方法:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 任务的具体执行类bean --> <bean id="testBean" class="TestQuartz" /> <!-- 任务 --> <bean name="reportTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 指定执行任务的对象 --> <property name="targetObject"> <ref bean="testBean"/> </property> <!-- 指定对象执行的方法 --> <property name="targetMethod"> <value>test</value> </property> </bean> <!-- 触发器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- 指向我们的任务 --> <property name="jobDetail" ref="reportTask" /> <!-- 每30s触发一次 --> <property name="cronExpression" value="30 * * * * ?" /> </bean> <!-- 调度器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- 触发器列表 --> <ref bean="cronTrigger" /> </list> </property> </bean> </beans>
可以看到,此配置与JobDetailBean配置的区别主要是任务bean的配置。讲到这里那就说说两者的区别吧。
JobDetailBean配置在任务bean中直接指定类(指定方法还不清楚属哪个属性,网上找了几个试了都不行,干脆在这不写,免得误人子弟,哈哈),最终任务执行重写了父类的方法即executeInternal(),而MethodInvokingJobDetailFactoryBean的配置通过targetObject指定任务类对应的bean,这个bean配置了class,也就是最终的指定类,并且可以通过targetMethod指定执行任务类中的哪个方法,指定了之后便不再去找executeInternal()执行。
四、至于调度器的配置,应该不用多说,看一眼就知道了,list中指定触发器就行。触发器的配置,jobDetai指定任务bean,cronExpression是时间的配置表达式,指定任务执行时间。总共7位数字,从左至右分别为秒、分、时、日、月、天(一周中的天数,如周一)、年。写的时候至少写6位,最后的年份可不写。关于这个表达式目前还没学透,只是大致了解,用到的话我也是去百度的,就不在此班门弄斧了!
至此,一个定时调度任务的所有需要做的任务就完成了,启动tomcat就能按照你的要求进行工作了。以下是demo中第二种配置的工作结果:
好了,今天到此结束!
标签:
原文地址:http://www.cnblogs.com/xiao-tao/p/5699106.html