spring执行定时任务
**第一种方式**
定义一个任务是很简单的实现TimerTask的run方法就可以了.
如下:SayHelloTask.java
**第一种方式**
定义一个任务是很简单的实现TimerTask的run方法就可以了.
如下:SayHelloTask.java
package
test.timerTask;
import java.util.TimerTask;
public class SayHelloTask extends TimerTask {
public void run() {
// TODO Auto-generated method stub
System.out.println( " 测试TimerTask : Hello !! " );
}
}
然后是配置文件:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >
< beans >
< bean id ="sayHelloTask" class ="test.timerTask.SayHelloTask" ></ bean >
< bean id ="scheduledTask" class ="org.springframework.scheduling.timer.ScheduledTimerTask" >
< property name ="timerTask" >
< ref bean ="sayHelloTask" />
</ property >
<!-- 任务执行周期 2m 关于一些任务的参数请参考JDK doc文档和Spring相关文档 -->
< property name ="period" >
< value > 2000 </ value >
</ property >
<!-- 延时1m 执行任务 -->
< property name ="delay" >
< value > 1000 </ value >
</ property >
</ bean >
<!-- 启动定时器 -->
< bean id ="timerBean" class ="org.springframework.scheduling.timer.TimerFactoryBean" >
< property name ="scheduledTimerTasks" >
< list >
< ref bean ="scheduledTask" />
</ list >
</ property >
</ bean >
</ beans >
import java.util.TimerTask;
public class SayHelloTask extends TimerTask {
public void run() {
// TODO Auto-generated method stub
System.out.println( " 测试TimerTask : Hello !! " );
}
}
然后是配置文件:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >
< beans >
< bean id ="sayHelloTask" class ="test.timerTask.SayHelloTask" ></ bean >
< bean id ="scheduledTask" class ="org.springframework.scheduling.timer.ScheduledTimerTask" >
< property name ="timerTask" >
< ref bean ="sayHelloTask" />
</ property >
<!-- 任务执行周期 2m 关于一些任务的参数请参考JDK doc文档和Spring相关文档 -->
< property name ="period" >
< value > 2000 </ value >
</ property >
<!-- 延时1m 执行任务 -->
< property name ="delay" >
< value > 1000 </ value >
</ property >
</ bean >
<!-- 启动定时器 -->
< bean id ="timerBean" class ="org.springframework.scheduling.timer.TimerFactoryBean" >
< property name ="scheduledTimerTasks" >
< list >
< ref bean ="scheduledTask" />
</ list >
</ property >
</ bean >
</ beans >
测试类如下:TestApp.java
package
test.timerTask;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestApp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestApp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一种方式
ApplicationContext context = new ClassPathXmlApplicationContext( " test/timerTask/javaTimer.xml " );
//第二种方式
// ApplicationContext context2 = new ClassPathXmlApplicationContext("test/timerTask/quartzTimer.xml");
}
// 只要加载配置文件就可以了,
}
**第二种方式**
使用Java中的定时器比较简单,其提供的任务也比较简单, 下面来看看使用quartz来执行一个复杂的任务.
首先制定一个任务, 实现QuartzJobBean中的方法.
首先制定一个任务, 实现QuartzJobBean中的方法.
package
test.timerTask;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class SayHelloTaskUsingQuartz extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
// TODO Auto-generated method stub
System.out.println( " 使用Quartz 认为调度: Hello!! " );
}
}
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class SayHelloTaskUsingQuartz extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
// TODO Auto-generated method stub
System.out.println( " 使用Quartz 认为调度: Hello!! " );
}
}
配置代码如下:quartzTimer.xml
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >
< beans >
< bean id ="sayHelloJob" class ="org.springframework.scheduling.quartz.JobDetailBean" >
< property name ="jobClass" >
< value > test.timerTask.SayHelloTaskUsingQuartz </ value >
</ property >
</ bean >
<!-- 关键在如下两个触发器的配置 -->
<!-- 类似于Java的简单触发器 -->
< bean id ="helloTrigger" class ="org.springframework.scheduling.quartz.SimpleTriggerBean" >
< property name ="jobDetail" >
< ref bean ="sayHelloJob" />
</ property >
< property name ="startDelay" >
< value > 1000 </ value >
</ property >
< property name ="repeatInterval" >
< value > 3000 </ value >
</ property >
</ bean >
<!-- 复杂触发器 -->
< bean id ="helloCronTrigger" class ="org.springframework.scheduling.quartz.CronTriggerBean" >
< property name ="jobDetail" >
< ref bean ="sayHelloJob" />
</ property >
< property name ="cronExpression" >
<!-- 关键在配置此表达式 -->
< value > 0 49 15 * * ? </ value >
</ property >
</ bean >
< bean id ="scheduler" class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name ="triggers" >
< ref bean ="helloCronTrigger" />
</ property >
</ bean >
</ beans >
public class MainTest {
/** * @param args */
public static void main(String[] args) {
System.out.println("Test start.");
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >
< beans >
< bean id ="sayHelloJob" class ="org.springframework.scheduling.quartz.JobDetailBean" >
< property name ="jobClass" >
< value > test.timerTask.SayHelloTaskUsingQuartz </ value >
</ property >
</ bean >
<!-- 关键在如下两个触发器的配置 -->
<!-- 类似于Java的简单触发器 -->
< bean id ="helloTrigger" class ="org.springframework.scheduling.quartz.SimpleTriggerBean" >
< property name ="jobDetail" >
< ref bean ="sayHelloJob" />
</ property >
< property name ="startDelay" >
< value > 1000 </ value >
</ property >
< property name ="repeatInterval" >
< value > 3000 </ value >
</ property >
</ bean >
<!-- 复杂触发器 -->
< bean id ="helloCronTrigger" class ="org.springframework.scheduling.quartz.CronTriggerBean" >
< property name ="jobDetail" >
< ref bean ="sayHelloJob" />
</ property >
< property name ="cronExpression" >
<!-- 关键在配置此表达式 -->
< value > 0 49 15 * * ? </ value >
</ property >
</ bean >
< bean id ="scheduler" class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name ="triggers" >
< ref bean ="helloCronTrigger" />
</ property >
</ bean >
</ beans >
**第三种方式**
package com.kay.quartz;
public class QuartzJob {
public void work(){
System.out.println("Quartz的任务调度!!!");
}
}
System.out.println("Quartz的任务调度!!!");
}
}
package com.kay.quartz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
/** * @param args */
public static void main(String[] args) {
System.out.println("Test start.");
ApplicationContext context = new ClassPathXmlApplicationContext(
"quartz-config.xml"); //如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
context.getBean("startQuertz");
System.out.print("Test end..");
}
}
"quartz-config.xml"); //如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
context.getBean("startQuertz");
System.out.print("Test end..");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd">
<beans><!-- 要调用的工作类 -->
<bean id="quartzJob" class="com.kay.quartz.QuartzJob"></bean><!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob" />
</property><!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean><!-- 定义触发时间 -->
<bean id="doTime"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobtask" />
</property><!-- cron表达式 -->
<property name="cronExpression">
<value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value>
</property>
</bean><!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime" />
</list>
</property>
</bean>
</beans>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd">
<beans><!-- 要调用的工作类 -->
<bean id="quartzJob" class="com.kay.quartz.QuartzJob"></bean><!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob" />
</property><!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean><!-- 定义触发时间 -->
<bean id="doTime"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobtask" />
</property><!-- cron表达式 -->
<property name="cronExpression">
<value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value>
</property>
</bean><!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime" />
</list>
</property>
</bean>
</beans>
注意:第二种和第三种定时需要两个jar包(本人测试时加的),jta.jar、quartz-all-1.6.0.jar
关于简单触发器和复杂触发器,查考下面的解释:
Quartz设计者做了一个设计选择来从调度分离开作业。Quartz中的触发器用来告诉调度程序作业什么时候触发。框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。SimpleTrigger为需要简单打火调度而设计。典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。另一方面,如果你有许多复杂的作业调度,那么或许需要CronTrigger。
CronTrigger是基于Calendar-like调度的。当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。
作为一个例子,下面的Quartz克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业。
0 15 10 ? * MON-FRI
下面的表达式
0 15 10 ? * 6L 2002-2005
将在2002年到2005年的每个月的最后一个星期五上午10点15分执行作业。
你不可能用SimpleTrigger来做这些事情。你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要
Quartz设计者做了一个设计选择来从调度分离开作业。Quartz中的触发器用来告诉调度程序作业什么时候触发。框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。SimpleTrigger为需要简单打火调度而设计。典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。另一方面,如果你有许多复杂的作业调度,那么或许需要CronTrigger。
CronTrigger是基于Calendar-like调度的。当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。
作为一个例子,下面的Quartz克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业。
0 15 10 ? * MON-FRI
下面的表达式
0 15 10 ? * 6L 2002-2005
将在2002年到2005年的每个月的最后一个星期五上午10点15分执行作业。
你不可能用SimpleTrigger来做这些事情。你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要
具体时间设定可参考
反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
星号(*)字符是通配字符,表示该字段可以接受任何可能的值。
秒?0-59?,?-?*?/?
分?0-59?,?-?*?/?
小时?0-23?,?-?*?/?
日期?1-31?,?-?*???/?L?W?C?
月份?1-12?或者?JAN-DEC?,?-?*?/?
星期?1-7?或者?SUN-SAT?,?-?*???/?L?C?#?
年(可选)?留空,?1970-2099?,?-?*?/?
分?0-59?,?-?*?/?
小时?0-23?,?-?*?/?
日期?1-31?,?-?*???/?L?W?C?
月份?1-12?或者?JAN-DEC?,?-?*?/?
星期?1-7?或者?SUN-SAT?,?-?*???/?L?C?#?
年(可选)?留空,?1970-2099?,?-?*?/?
"0/10 * * * * ?" 每10秒触发
"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触发
每隔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 * * ?