Spring--Quartz 任务调度的配置详解
Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。
关于Quartz的更多信息,可以访问Quartz位于http://www.opensymphony.com/quartz的主页。
项目中需要的jar包:
spring-framework-2.5.6\dist\spring.jar
spring-framework-2.5.6\lib\quartz\quartz-all-1.6.1.jar
spring-framework-2.5.6\lib\jakarta-commons\commons-logging.jar
spring-framework-2.5.6\lib\jakarta-commons\commons-collections.jar
spring-framework-2.5.6\lib\log4j\log4j-1.2.15.jar
下面为Quartz配置操作详述:
A:extends QuartzJobBean方法
1:定义任务(extends QuartzJobBean)
package com.sample.quartz;
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class QuartzExtends extends QuartzJobBean {
private JobData jobData; //JobData为自定义类
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;
}
}
JobData.java:
package onlyfun.bb.Quartz;
import java.util.Date;
public class JobData {
public String getData(){
return "Data from JobData at "+new Date().toString();
}
}
2: 配置
<!-- 继承quartzjobbean的配置 -->
<bean id="someData" class="com.sample.quartz.JobData"></bean>
<bean id="jobDetailBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.sample.quartz.QuartzExtends"></property>
<property name="jobDataAsMap">
<map>
<entry key="jobData" value-ref="someData"></entry>
</map>
</property>
</bean>
<bean id="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetailBean"></property>
<property name="repeatInterval" value="2000"></property>
<property name="startDelay" value="1000"></property>
</bean>
<!-- quartz触发器管理 -->
<bean id="sdf"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加触发器 -->
<property name="triggers">
<list>
<ref bean="simpleTriggerBean" />
<!--这里调用的列表,还可以添加其他的任务 -->
</list>
</property>
</bean>
注意:在JobDetailBean的jobClass属性必须提供Job的类名称,而不是Job类的实例。Job所需的数据可以在jobDataAsMap属性中设置。
在任务的周期指定上,使用SimpleTriggerBean类来指定,与TimerTask指定方式类似。
排定Job用SchedulerFactoryBean类。
完成设置后,只要在启动Spring并读取定义文件后,计划任务就会执行。
B:不需要继承的任务制定方法
使用Spring不一定需要继承QuartzJobBean类来定义1个Job类,可以使用MethodInvokingJobDetailFactoryBean来直接指定执行某个对象的方法。
1。建立调度类
package com.sample.quartz;
import java.text.SimpleDateFormat;
import java.util.Date;
public class QuartzSimple{
/*
* 该方法为任务调度是自动调用的方法,在这里可以实现你要实现的功能
*/
public void test() {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()) + "时刻的调用");
}
}
2。对applicationContext.xml进行配置,配置文件如下:
<!--定时执行配置 -->
<bean id="testQuartz" class="com.sample.quartz.QuartzSimple" />
<!-- bean触发方法配置 -->
<bean name="quartzBean"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- bean名字 -->
<property name="targetObject" ref="testQuartz" /><!--目标对象-->
<!-- bean方法 -->
<property name="targetMethod"><!--目标方法-->
<value>test</value>
</property>
<property name="concurrent"><!--配置为false不允许任务并发执行-->
<value>false</value>
</property>
</bean>
<!-- bean触发时间配置,指定具体的时间执行 -->
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 触发bean配置 -->
<property name="jobDetail" ref="quartzBean" />
<!-- 触发时间配置 -->
<property name="cronExpression">
<value>0/10 * * * * ?</value>
</property>
</bean>
C.web程序测试
在web.xml中对Spring进行配置,配置文件代码如下:
<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
序号
|
说明
|
是否必填
|
允许填写的值
|
允许的通配符
|
1
|
秒
|
是
|
0-59
|
, - * /
|
2
|
分
|
是
|
0-59
|
, - * /
|
3
|
小时
|
是
|
0-23
|
, - * /
|
4
|
日
|
是
|
1-31
|
, - * ? / L W
|
5
|
月
|
是
|
1-12 or JAN-DEC
|
, - * /
|
6
|
周
|
是
|
1-7 or SUN-SAT
|
, - * ? / L #
|
7
|
年
|
否
|
empty 或 1970-2099
|
, - * /
|
注意:使用SimpleTriggerBean类只能做简单Job与Job之间的执行周期指定,如果需要在指定时间执行,可以使用CronTriggerBean类。
SimpleTriggerBean:
<property name="startDelay" value="1000"></property><property name="repeatInterval" value="2000"></property>
CronTriggerBean:
<property name="cronExpression" value="0 37-38 15 * * ?"/>
注意:CronTriggerBean的cronExpression属性指定格式:至少6个时间元素,上面表示每天的15:37-38分执行1次任务。
2012年2月8日22:59:09
0 30/3 9-21 * * ? --------------每天的9:30-22:00每隔三分种执行一次任务