ITEEDU

使 TimerTask

要定义一个排程任务(Task),您可以继承 java.util.TimerTask 类别,例如:

•      DemoTask.java
package onlyfun.caterpillar;
import java.util.TimerTask;
public class DemoTask extends TimerTask {
	public void run() {
		System.out.println("Task is executed.");
	}
}

接着您可以使用 Spring 的 org.springframework.scheduling.timer.ScheduledTimerTask 来定 义任务的执行周期,例如:

•      beans-config.xml
<?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="demoTask" class="onlyfun.caterpillar.DemoTask"/>
	<bean id="scheduledTimerTask" class="org.springframework.scheduling.
		→ timer.ScheduledTimerTask">
		<property name="timerTask">
			<ref bean="demoTask"/>
		</property>
		<property name="period">
			<value>600000</value>
		</property>
		<property name="delay">
			<value>10000</value>
		</property>
	</bean>
	<bean id="timerFactoryBean" class="org.springframework.scheduling.
		→ timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
			<list>
				<ref bean="scheduledTimerTask"/>
			</list>
		</property>
	</bean>
</beans>

在 ScheduledTimerTask 类别的"period"属性中,定义的单位是毫秒,因此根据以上的定义中, 将每 10 分钟执行一次所定义的任务,而"delay"属性定义了 Timer 启动后,第一次执行任务前要 延迟多少毫秒。

定义好的 ScheduledTimerTask 要使用 org.springframework.scheduling.timer.TimerFactoryBean 类别来加入所有的排程任务,接下 来只要 Spring 容器启动读取完定义档,就会开始进行所排定的任务,例如:

•      TimerTaskDemo.java
package onlyfun.caterpillar;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class TimerTaskDemo {
	public static void main(String[] args) throws IOException {
		new FileSystemXmlApplicationContext("beans-config.xml");
		System.out.println("启动 Task..");
		System.out.println("请输入 exit 关闭 Task: ");
		BufferedReader reader =new BufferedReader(
				new InputStreamReader(System.in));
		while(true) {
			if(reader.readLine().equals("exit")) { System.exit(0);
			}
		}
	}
}

根据 Bean 定义档的内容,这个程式在启动后 10 秒会执行第一次任务,之后每 10 分钟执行一次 任务。