边城愚人

如果我不在边城,我一定是在前往边城的路上。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  31 随笔 :: 0 文章 :: 96 评论 :: 0 Trackbacks

        JDK 内建的任务调度工具类有 Timer TimerTask 类,对于简单的任务调度, JDK Timer 就能够胜任。一般来说, Timer 应该随程序启动后一直运行。如果是 web 程序,可以通过 listener 加载 Timer 实例。对于普通的应用程序,需要将 Timer 设置成非后台线程才行。

        来看一个简单的例子:

   
import java.util.Calendar;

import java.util.TimerTask;


public class ATask extends TimerTask{


private static final int TASK_TIME = 20;

private static boolean isRunning = false;

@Override

public void run() {

Calendar c 
= Calendar.getInstance();

if(!isRunning){

isRunning 
= true;

if(TASK_TIME == c.get(Calendar.HOUR_OF_DAY)){

doSomeTask();

}

isRunning 
= false;

}

}


public void doSomeTask(){

try {

Thread.sleep(
1000);

System.out.println(
"ATask has doSomeTask..");

catch (InterruptedException e) {

e.printStackTrace();

}

}

}

        Atask的任务是在20点的时候doSomeTask(),其中isRunning是用来避免重复调用。

        我们可以在main中调用它:

Timer t = new Timer(false);// false意味不是后台线程,这样主程序不会终止

t.schedule(new ATask(), 0, 500);// Timer0延迟,每隔500毫秒的用一次 Ataskrun方法。


        在spring中,可以通过配置文件设置Timer的延迟、间隔信息,并利用SpringTimerFactoryBean,建立实际的调度。还是上面的 Atask,可以如下配置Spring文件:

<?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="aTask" class="org.prague.util.ATask">

</bean>


<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">

<property name="delay" value="0"/>

<property name="period" value="1000"/>

<property name="timerTask" ref="aTask"/>

</bean>


<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">

<property name="scheduledTimerTasks">

<list>

<ref local="scheduledTask"/>

</list>

</property>

<property name="daemon" value="false"/>

</bean>

</beans>


        由于daemonfalse,在主函数中,只需如下

        ApplicationContext ac = new ClassPathXmlApplicationContext("timer-spring.xml");就可以调度任务了。

        如果你的Task不想继承 TimerTask,可以通过SpringMethodInvokingTimerTaskFactoryBean进行设置。例如有个Task如下:


public class AnotherTask {

private static final int TASK_TIME = 9;

private static boolean isRunning = false;

public void run() {

Calendar c 
= Calendar.getInstance();

if(!isRunning){

isRunning 
= true;

if(TASK_TIME == c.get(Calendar.HOUR_OF_DAY)){

doSomeTask();

}

isRunning 
= false;

}

}


public void doSomeTask(){

try {

Thread.sleep(
2000);

System.out.println(
"AnotherTask has doSomeTask..");

catch (InterruptedException e) {

e.printStackTrace();

}

}

}

        可以通过以下配置实现任务调度:

<?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="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">

<property name="scheduledTimerTasks">

<list>

<ref local="anotherScheduledTask"/>

</list>

</property>

<property name="daemon" value="false"/>

</bean>


<bean id="anotherTaskTarget" class="org.prague.util.AnotherTask">

</bean>


<bean id="anotherTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">

<property name="targetObject" ref="anotherTaskTarget"/>

<property name="targetMethod" value="run"/>

</bean>


<bean id="anotherScheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">

<property name="delay" value="0"/>

<property name="period" value="1000"/>

<property name="timerTask" ref="anotherTask"/>

</bean>

</beans>


        该说的已经差不多了。JDKTimer使用还是很简单的,但对于复杂的任务调度,就需要在 TimerTask中进行判断。当然,还有其他的选择,比如Quartz就是很不错的任务调度工具,它也能和Spring的搭配得很出色。


posted on 2007-07-19 09:50 kafka0102 阅读(2880) 评论(4)  编辑  收藏 所属分类: Framework

评论

# re: 在spring中使用Timer[未登录] 2007-07-19 12:27 jones
老大,Quartz可不是Spring的“同门师弟“,别误会啊!  回复  更多评论
  

# re: 在spring中使用Timer 2007-07-19 14:27 Winefox
楼主莫要误人子弟

补充楼上:


Quartz是WebWork的同门师弟……  回复  更多评论
  

# re: 在spring中使用Timer 2007-07-19 17:25 小雪飞刀
不知楼主是否做过测试,Quartz和JDK TimerTask哪种方式控制起来更快捷、方便?一直再用Quartz,对JDK TimerTask了解不多,望楼主赐教!  回复  更多评论
  

# re: 在spring中使用Timer 2007-07-20 08:55 kafka0102
不好意思,记错了,以为Spring也是opnesymphony 的东东了。。我对Quartz也不是很了解,它在做复杂的任务调度方面要更好些,因为它可以在配置文件中配置调度策略,而Timer则只能写在TimerTask中。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: