在web应用中设计定时执行任务 Listener

在 web 应用中  设计定时执行的任务;
方法一:
使用Servlet上下文有关的侦听器
步骤:
(一)
创建一个Listener 类 实现接口:ServletContextListener 
实现接口的两个方法:
package com.bjmobile.action;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
 * 侦听器类 和Timer 结合起来 完成侦听定时执行任务;
 * @author new
 *
 */
public class ContextListener implements ServletContextListener {
 private java.util.Timer timer = null;

 public void contextInitialized(ServletContextEvent event) {
  timer = new java.util.Timer(true);// true表明定义为守护线程;
  System.out.println("定时器已启动");
  // 定时器调度语句,其中MyTask是自定义需要被调度的执行任务
       // 初始化时就 执行一次任务;
  //此例为每隔三分钟执行一次任务;
  timer.schedule(new MyTask(), 0, 3 * 60 * 1000);
  System.out.println("已经添加任务调度表");
 }
 public void contextDestroyed(ServletContextEvent event) {
  timer.cancel();
  System.out.println("定时器销毁");
 }
}

(二)   
创建一个任务类MyTask:继承TimerTask类
 把任务写在run方法中:
package com.bjmobile.action;

import java.util.Calendar;
import java.util.TimerTask;

// 定时执行的任务类
public class MyTask extends TimerTask {
 private static final int C_SCHEDULE_HOUR = 11;
 private static boolean isRunning = false;
 public void run() {
  Calendar cal = Calendar.getInstance();
  if (!isRunning) {
   if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
    //时间为11点时才执行任务,否则不执行;
    //所以调度器timer.schedule的间隔时间不能大于一小时,否则可能错过时间段;
    //调度器timer.schedule的间隔时间也不能小于一小时,否则可能一天执行几次任务;
    isRunning = true;
    System.out.println("开始执行指定任务");

    // TODO 添加自定义的详细任务,以下只是示例
    int i = 0;
    while (i++ < 5) {
     System.out.println("已完成任务的" + i + "/" + 10);
    }
    //end

    isRunning = false;
    System.out.println("指定任务执行结束");
   } else {
    System.out.println("还不到任务执行的时间");
   }
  } else {
   System.out.println("上一次任务执行还未结束");
  }
 }
}

(三)
在 web.xml文件中配置 Listener 类:
 
        com.bjmobile.action.ContextListener
 

 
 
 
方法二:
使用一个专门的servlet,把任务调度器初始化放在servlet的init方法中,设置web服务器自动加载此servlet
步骤:
(一)
创建一个TaskServlet 类

package com.bjmobile;

import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
/**
 * servlet 和Timer 结合起来 完成侦听定时执行任务,在初始化时加载调度器;
 * @author new
 *
 */
public class TaskServlet extends HttpServlet {

 private static final long serialVersionUID = 1L;
 Timer timer = new Timer();
 public void init() throws ServletException {
  String sendmailhour = "14";
  String sendmailminutes = "04";
  String sendmailsecond = "30";
  // 设置首次执行时间;
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sendmailhour));
  cal.set(Calendar.MINUTE, Integer.parseInt(sendmailminutes));
  cal.set(Calendar.SECOND, Integer.parseInt(sendmailsecond));
  System.out.println("******* 1. current time:"+cal.getTime());

  // 由于timer初始化时,如果定时器定的当天的时间已经过去了马上执行一次任务,
  // 如果当天的时间还不到,则等时间到了 再执行任务;
  
        // 定时器调度语句,其中TestTask是自定义需要被调度的执行任务
  // cal.getTime()为首次执行时间;
     // 此例以后过24小时执行一次任务;
  timer.schedule(new TestTask(), cal.getTime(), 24 * 60 * 60 * 1000);
  System.out.println("定时器2已启动");
 }

 @Override
 public void destroy() {
  // TODO Auto-generated method stub
  super.destroy();
  timer.cancel(); //要主动销毁;否则关闭项目应用时,定时器没被销毁
  System.out.println("定时器2销毁!");
 }
}


(二)  
创建一个任务类TestTask:继承TimerTask类
 把任务写在run方法中:
package com.bjmobile;
import java.util.TimerTask;

// 定时执行的任务类
public class TestTask extends TimerTask {
 public void run() {

  System.out.println("执行任务");

 }
}

(三)
在 web.xml文件中配置 servlet 类:
 
    taskServlet
    com.bjmobile.TaskServlet
    0
 

 // 这个servlet是执行后台操作,不需要相应外部请求,因此没有必要为它定义servlet-mapping。
 // 1 必须设置,容器自动初始化,加载任务;

 
 

你可能感兴趣的:(任务,web,servlet,import,timer,calendar)