自動任務調度 - Timer

一、概述:


最近維護一個老項目,裏面使用的是Timer的時間調度器,以前沒接觸過,對着代碼鼓搗了半天,查閱了部分博客,最後總結出自己的見解,新項目一般是不會用這種老掉牙的時間調度器了,但是維護老項目還是用的着的。就當筆記記錄一下了,自己寫的才是符合自己的思路走向的。有時間再補上Quartz調度器,這個才是現在使用最多的。


二、常用的三種調度器分類


Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。



使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜。



Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。


三、使用Spring體系來完成代碼的搭建


1、代碼結構:


                                  


 


 


 


2、springContext.xml文件


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init
="true">

<!--定義了一個TimerFactoryBean類,並且把ScheduledTimerTask類的實例作為需要調度的task。-->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" lazy-init="false">
<property name="scheduledTimerTasks">
<list>
<ref local="scheduledTask1"/>
<ref local="scheduledTask2"/>
</list>
</property>
</bean>

<!--利用ScheduledTimerTask類來配置每個task的啟動時間延時,每次啟動之間的間隔,當然還有最重要的是需要運行那個對象,也就是MethodInvokingTimerTaskFactoryBean類的實例-->
<bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="0" />
<property name="period" value="1000" />
<property name="timerTask">
<ref bean="methodInvokingTask1"/>
</property>
</bean>

<bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="0" />
<property name="period" value="1000" />
<property name="timerTask">
<ref bean="methodInvokingTask2"/>
</property>
</bean>

<!--利用spring提供的MethodInvokingTimerTaskFactoryBean類來實現來實現對對task類和方法的聲明,聲明目標對象和方法,從而使spring知道要運行那個類的那個方法-->
<bean id="methodInvokingTask1" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask1"/>
<property name="targetMethod" value="run"/>
</bean>

<bean id="methodInvokingTask2" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask2"/>
<property name="targetMethod" value="run"/>
</bean>

<!--被指定自動任務的類對象-->
<bean id="myTask1" class="com.turtle.test.MyTask">
<property name="name" value="啟動一"/>
</bean>

<bean id="myTask2" class="com.turtle.test.MyTask_2">
<property name="name" value="啟動二"/>
</bean>

</beans>

 


3、MyTask文件


package com.turtle.test;

import java.util.TimerTask;

/**
* 自定義一個定時任務
* 推薦是繼承自 TimerTask
*/
public class MyTask extends TimerTask {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

private static int i = 0;

// 使用線程中的方法 run
@Override
public void run() {
System.out.println(
"定時任務啟動"+name+"----出現了"+i++);
}
}

 


4、MyTask_2文件


package com.turtle.test;

import java.util.TimerTask;

/**
* 自定義一個定時任務
* 推薦是繼承自 TimerTask
*/
public class MyTask_2 extends TimerTask {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

private static int i = 0;

// 使用線程中的方法 run
@Override
public void run() {
System.out.println(
"定時任務啟動"+name+"----出現了"+i++);
}
}

 


 


5、MyTestTask_Test_01


package com.turtle.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTestTask_Test_01 {
public static void main(String[] args) {
// 啟動測試
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springContext.xml");
}
}

 


 


6、結果:


 


                        


四、總結:


如果要使用TImer的調度器的話,推薦使用新的ScheduledExecutorService,這個目前沒使用,就沒進行代碼驗證了,推薦一博客,大概看了下,寫得挺好的

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能



※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享



※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選



※評比南投搬家公司費用收費行情懶人包大公開



※幫你省時又省力,新北清潔一流服務好口碑



Orignal From: 自動任務調度 - Timer

留言