自動任務排程 - Timer
阿新 • • 發佈:2019-11-13
一、概述:
最近維護一個老專案,裡面使用的是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,這個目前沒使用,就沒進行程式碼驗證了,推薦一部落格,大概看了下,寫得挺好的https://blog.csdn.net/wangmx1993328/article/details/8084