黑马程序员技术交流社区

标题: 【分享】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()方法。
  实例代码:

  1. <font size="4" face="Arial">package com.walkerjava.util;
  2. import java.util.Calendar;   
  3. import java.util.TimerTask;   
  4. import javax.servlet.ServletContext;   

  5. public class MyTimerTask extends TimerTask{   
  6.         private static final int C_SCHEDULE_HOUR = 0;   
  7.         private static boolean isRunning = false;   
  8.         private ServletContext context = null;   
  9.         public myTimerTask(ServletContext context) {   
  10.                 his.context = context;   
  11.         }           
  12.         @Override   
  13.         public void run() {   
  14.                 Calendar c = Calendar.getInstance();   
  15.                 if(!isRunning)  {   
  16.                         if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {   
  17.                                isRunning = true;   
  18.                                 context.log("开始执行指定任务");   
  19.                                 isRunning = false;   
  20.                                 context.log("指定任务执行结束");   
  21.                         } else  {   
  22.                                 context.log("上一次任务执行还未结束");   
  23.                         }   
  24.                 }   
  25.         }   
  26. }  </font>
复制代码
方法2)ServletContextListener  
这个方法在web容器环境比较方便,这样,在web server启动后就可以自动运行该任务,不需要手工操作。   
将TimerTaskListener implements ServletContextListener接口,在contextInitialized方法中加入启动Timer的代码,
在contextDestroyed方法中加入cancel该Timer的代码。
实例代码;

  1. <font face="Arial">package com.walkerjava.util;
  2. import java.util.Timer;   
  3. import javax.servlet.ServletContextEvent;   
  4. import javax.servlet.ServletContextListener;
  5. public class TimerTaskListener implements ServletContextListener{   
  6.         private Timer timer = null;     
  7.         @Override  
  8.         public void contextDestroyed(ServletContextEvent event) {   
  9.                 timer.cancel();   
  10.                 event.getServletContext().log("定时器销毁");   
  11.                 System.out.println("停止备份程序……");   
  12.         }      
  13.         @Override  
  14.         public void contextInitialized(ServletContextEvent event) {   
  15.                 // 在这里初始化监听器,在tomcat启动的时候监听器启动
  16.                 // 提示可以在这里实现定时器功能   
  17.                 timer = new Timer(true);
  18.                 // 添加日志,可在tomcat日志中查看到
  19.                 event.getServletContext().log("定时器已启动");
  20.                 // 调用 MyTimerTask,0表示任务无延迟,
  21.                 // 5*1000表示每隔5秒执行任务,60*60*1000表示一个小时
  22.                 timer.schedule(new MyTimerTask(event.getServletContext()), 0, 5*1000);
  23.         }   
  24. } </font>
复制代码
最后在web.xml中,加入listener配置:
  1. <p><listener>    </p><p>      <listenerclass>com.walkerjava.util.TimerTaskListener</listener-class>   
  2. </listener></p>
复制代码
方法3)org.springframework.scheduling.timer.ScheduledTimerTask   
如果你用spring,那么你不需要写Timer类了,在spring.xml中加入下面的内容就可以了:
  1. <font size="4"><bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">   
  2.         <property name="scheduledTimerTasks">   
  3.                 <list><ref local="sTimerTask"/></list>   
  4.         </property>   
  5. </bean>   
  6. <bean id="myTimerTask" class="com.walkerjava.util.MyTimerTask"/>   
  7. <bean id="sTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">   
  8.         <property name="timerTask">   
  9.                 <ref bean="myTimerTask"/>   
  10.         </property>
  11.         <!-- web服务启动后延迟10000毫秒执行 -->
  12.         <property name="delay">   
  13.                 <value>10000</value>   
  14.         </property>
  15.         <!-- 每隔86400000毫秒执行 -->
  16.         <property name="period">   
  17.                 <value>86400000</value>   
  18.         </property>   
  19. </bean></font>
复制代码
方法4)org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
实例代码:
  1. package com.walkerjava.util;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Timer;
  8. // 定时备份数据库数据
  9. public class DatabaseTask {
  10.         private DatabaseDao databaseDao;
  11.         private List<Map<String, Object>> businessList = null;
  12.         private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  13.         private Timer timer=new Timer();     
  14.         public void setDatabaseDao(DatabaseDao databaseDao) {
  15.                 this.databaseDao = databaseDao;
  16.         }
  17.         // 定时任务要执行的方法体
  18.        public void databaseMainTask(){
  19.                 businessList = databaseDao.getBusinessToBackup();
  20.                 for(Map<String, Object> map:businessList){
  21.                         DatabaseBackupTask databaseBackupTask = new DatabaseBackupTask();;
  22.                         databaseBackupTask.setBusinessMap(map);
  23.                         String data = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " " + map.get("baktime").toString();
  24.                         try {
  25.                                 timer.schedule(databaseBackupTask,sdf.parse(data));
  26.                         } catch (ParseException e) {
  27.                                 e.printStackTrace();
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码
Spring配置文件配置:
  1. <bean id="databaseTask" class="com.walkerjava.util.DatabaseTask">
  2.         <property name="databaseDao" ref="databaseDao"></property>
  3. </bean>
  4. <bean id="databaseDao" class="com.walkerjava.util.DatabaseDao"></bean>
  5. <!-- 定时任务的声明开始,该部分是一个定时器的声明,Start -->
  6. <!-- 系统配置信息加载定时任务 -->
  7. <bean id="databaseTaskConfig" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  8.         <property name="targetObject">
  9.                 <!-- 定时执行的类 -->
  10.                 <ref bean="databaseTask" />
  11.         </property>
  12.         <property name="targetMethod">
  13.                 <!-- 定时执行的类方法 -->
  14.                 <value>methodTask</value>
  15.         </property>
  16. </bean>
  17. <!-- 简单定时,一般为系统运行后多少时间和每间隔多长时间执行(简单的定时) -->
  18. <bean id="databaseTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  19.         <!-- 配置的需要定时的类   -->
  20.         <property name="jobDetail">
  21.                 <ref bean="databaseTaskConfig" />
  22.         </property>
  23.         <!-- 首次执行等待时间,毫秒,tomcat启动10秒后执行  -->
  24.         <property name="startDelay">
  25.                 <value>5000</value>
  26.         </property>
  27.         <!-- 每隔多久执行一次,毫秒,每隔6个小时执行一次 -->
  28.         <property name="repeatInterval">
  29.                 <value>1296000000</value>
  30.       </property>
  31. </bean>
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2