黑马程序员技术交流社区
标题:
【分享】Java中实现定时执行任务的N种方法
[打印本页]
作者:
狼王
时间:
2013-10-6 19:54
标题:
【分享】Java中实现定时执行任务的N种方法
1、
Java实现定时执行任务的几种方法:
1) java.util.Timer.
2) ServletContextListener.
3) org.springframework.scheduling.timer.ScheduledTimerTask
4) org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
方法1)java.util.Timer
这个方法应该是最常用的,不过这个方法需要手工启动你的任务:
Timer timer = new Timer();
timer.schedule(new MyTimerTask(),10000,86400000);
这里的MyTimerTask类必须extends TimerTask里面的run()方法。
实例代码:
<font size="4" face="Arial">package com.walkerjava.util;
import java.util.Calendar;
import java.util.TimerTask;
import javax.servlet.ServletContext;
public class MyTimerTask extends TimerTask{
private static final int C_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public myTimerTask(ServletContext context) {
his.context = context;
}
@Override
public void run() {
Calendar c = Calendar.getInstance();
if(!isRunning) {
if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定任务");
isRunning = false;
context.log("指定任务执行结束");
} else {
context.log("上一次任务执行还未结束");
}
}
}
} </font>
复制代码
方法2)ServletContextListener
这个方法在web容器环境比较方便,这样,在web server启动后就可以自动运行该任务,不需要手工操作。
将TimerTaskListener implements ServletContextListener接口,在contextInitialized方法中加入启动Timer的代码,
在contextDestroyed方法中加入cancel该Timer的代码。
实例代码;
<font face="Arial">package com.walkerjava.util;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TimerTaskListener implements ServletContextListener{
private Timer timer = null;
@Override
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
System.out.println("停止备份程序……");
}
@Override
public void contextInitialized(ServletContextEvent event) {
// 在这里初始化监听器,在tomcat启动的时候监听器启动
// 提示可以在这里实现定时器功能
timer = new Timer(true);
// 添加日志,可在tomcat日志中查看到
event.getServletContext().log("定时器已启动");
// 调用 MyTimerTask,0表示任务无延迟,
// 5*1000表示每隔5秒执行任务,60*60*1000表示一个小时
timer.schedule(new MyTimerTask(event.getServletContext()), 0, 5*1000);
}
} </font>
复制代码
最后在web.xml中,加入listener配置:
<p><listener> </p><p> <listenerclass>com.walkerjava.util.TimerTaskListener</listener-class>
</listener></p>
复制代码
方法3)org.springframework.scheduling.timer.ScheduledTimerTask
如果你用spring,那么你不需要写Timer类了,在spring.xml中加入下面的内容就可以了:
<font size="4"><bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list><ref local="sTimerTask"/></list>
</property>
</bean>
<bean id="myTimerTask" class="com.walkerjava.util.MyTimerTask"/>
<bean id="sTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask">
<ref bean="myTimerTask"/>
</property>
<!-- web服务启动后延迟10000毫秒执行 -->
<property name="delay">
<value>10000</value>
</property>
<!-- 每隔86400000毫秒执行 -->
<property name="period">
<value>86400000</value>
</property>
</bean></font>
复制代码
方法4)org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
实例代码:
package com.walkerjava.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Timer;
// 定时备份数据库数据
public class DatabaseTask {
private DatabaseDao databaseDao;
private List<Map<String, Object>> businessList = null;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private Timer timer=new Timer();
public void setDatabaseDao(DatabaseDao databaseDao) {
this.databaseDao = databaseDao;
}
// 定时任务要执行的方法体
public void databaseMainTask(){
businessList = databaseDao.getBusinessToBackup();
for(Map<String, Object> map:businessList){
DatabaseBackupTask databaseBackupTask = new DatabaseBackupTask();;
databaseBackupTask.setBusinessMap(map);
String data = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " " + map.get("baktime").toString();
try {
timer.schedule(databaseBackupTask,sdf.parse(data));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
复制代码
Spring配置文件配置:
<bean id="databaseTask" class="com.walkerjava.util.DatabaseTask">
<property name="databaseDao" ref="databaseDao"></property>
</bean>
<bean id="databaseDao" class="com.walkerjava.util.DatabaseDao"></bean>
<!-- 定时任务的声明开始,该部分是一个定时器的声明,Start -->
<!-- 系统配置信息加载定时任务 -->
<bean id="databaseTaskConfig" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<!-- 定时执行的类 -->
<ref bean="databaseTask" />
</property>
<property name="targetMethod">
<!-- 定时执行的类方法 -->
<value>methodTask</value>
</property>
</bean>
<!-- 简单定时,一般为系统运行后多少时间和每间隔多长时间执行(简单的定时) -->
<bean id="databaseTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 配置的需要定时的类 -->
<property name="jobDetail">
<ref bean="databaseTaskConfig" />
</property>
<!-- 首次执行等待时间,毫秒,tomcat启动10秒后执行 -->
<property name="startDelay">
<value>5000</value>
</property>
<!-- 每隔多久执行一次,毫秒,每隔6个小时执行一次 -->
<property name="repeatInterval">
<value>1296000000</value>
</property>
</bean>
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2