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

本文介绍两种在Web应用中设计定时任务的方法:一种是通过实现ServletContextListener接口并结合Timer类来实现;另一种是利用Servlet与Timer类组合,在Servlet的init方法中初始化任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 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 类:
 <listener>
        <listener-class>com.bjmobile.action.ContextListener</listener-class>
 </listener>
 
 
 
方法二:
使用一个专门的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 类:
  <servlet>
    <servlet-name>taskServlet</servlet-name>
    <servlet-class>com.bjmobile.TaskServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
 // 这个servlet是执行后台操作,不需要相应外部请求,因此没有必要为它定义servlet-mapping。
 // <load-on-startup>1</load-on-startup> 必须设置,容器自动初始化,加载任务;

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值