Spring执行定时任务
package?test.timerTask;
?2
?3
import?java.util.TimerTask;
?4
?5
public?class?Task?extends?TimerTask?{
?6
?7
??@Override
?8
??public?void?run()?{
?9
????//?TODO?Auto-generated?method?stub
10
????System.out.println("测试TimerTask?:?Hello?!!");
11
??}
12
13
}?1
package?test.springTimer;
?2
?3
import?java.util.TimerTask;
?4
?5
public?class?Task2?extends?TimerTask{
?6
????public?void?run(){
?7
????????
?8
????????System.out.println("task2?is?running");
?9
????}
10
11
????
12
}
13
然后是配置文件:?
<?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="sayHelloTask" style="max-width: 100%;height: auto;width: auto\9;" src="//img.reader8.net/uploadfile/jiaocheng/201401104/2859/2014012816594120627.gif">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
????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("test/timerTask/javaTimer.xml");
?//???ApplicationContext?context2?=?new?ClassPathXmlApplicationContext("test/timerTask/quartzTimer.xml");
??}
//?只要加载配置文件就可以了,
}?
运行结果:
task2 is running
task2 is running
haha,task is running
haha,task is running
task2 is running?二、java中的定时器比较简单,执行的任务也比较简单,下面是使用quartz来执行复杂的日任务。
?1
package?test.timerTask;
?2
?3
import?org.quartz.JobExecutionContext;
?4
import?org.quartz.JobExecutionException;
?5
import?org.springframework.scheduling.quartz.QuartzJobBean;
?6
?7
public?class?SayHelloTaskUsingQuartz?extends?QuartzJobBean?{
?8
?9
??@Override
10
??protected?void?executeInternal(JobExecutionContext?context)
11
??????throws?JobExecutionException?{
12
????//?TODO?Auto-generated?method?stub
13
????System.out.println("使用Quartz?认为调度:?Hello!!");
14
??}
15
16
}?
17
<?xml version="1.0" encoding="UTF-8"?>
??? <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<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>
?
关于简单触发器和复杂触发器,查考下面的解释:?
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来做这些事情。你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要。?
更多详细介绍参考此处:?
关于cronExpression的介绍:?
??? <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">??????? <property name="triggers">??????????? <list><ref local="cronTrigger"/></list>??????? </property>??? </bean>
上面这段配置文件规定了在早上6点和晚上8点执行financeDAO对象的confirmOrder()方法.