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>
复制代码 |
|