A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM代景康 高级黑马   /  2013-10-8 08:53  /  1268 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public void contextInitialized(ServletContextEvent arg0) ...{

  //②在Web容器启动时自动执行该方法

  System.out.println("Web应用程序启动...");

  timer = new Timer();//②-1:创建一个Timer,Timer内部自动创建一个背景线程

  TimerTask task = new SimpleTimerTask();

  timer.schedule(task, 1000L, 5000L); //②-2:注册一个5秒钟运行一次的任务

  }

  }

  class SimpleTimerTask extends TimerTask ...{//③任务

  private int count;

  public void run() ...{

  System.out.println((++count)+"execute task..."+(new Date()));

  }

  }

  //代码清单StartCycleRunTask:容器监听器

  package com.baobaotao.web;

  import java.util.Date;

  import java.util.Timer;

  import java.util.TimerTask;

  import javax.servlet.ServletContextEvent;

  import javax.servlet.ServletContextListener;

  public class StartCycleRunTask implements ServletContextListener ...{

  private Timer timer;

  public void contextDestroyed(ServletContextEvent arg0) ...{

  // ②该方法在Web容器关闭时执行

  System.out.println("Web应用程序启动关闭...");

  }

  public void contextInitialized(ServletContextEvent arg0) ...{

  //②在Web容器启动时自动执行该方法

  System.out.println("Web应用程序启动...");

  timer = new Timer();//②-1:创建一个Timer,Timer内部自动创建一个背景线程

  TimerTask task = new SimpleTimerTask();

  timer.schedule(task, 1000L, 5000L); //②-2:注册一个5秒钟运行一次的任务

  }

  }

  class SimpleTimerTask extends TimerTask ...{//③任务

  private int count;

  public void run() ...{

  System.out.println((++count)+"execute task..."+(new Date()));

  }

  }

  在web.xml中声明这个Web容器监听器:

  …

  com.baobaotao.web.StartCycleRunTask

  在Tomcat中部署这个Web应用并启动后,你将看到任务每隔5秒钟执行一次。

  运行一段时间后,登录Tomcat管理后台,将对应的Web应用(chapter13)关闭。

  转到Tomcat控制台,你将看到虽然Web应用已经关闭,但Timer任务还在我行我素地执行如故——舞台已经拆除,戏子继续表演:

  我们可以通过改变清单StartCycleRunTask的代码,在contextDestroyed(ServletContextEvent arg0)中添加timer.cancel()代码,在Web容器关闭后手工停止Timer来结束任务。

  Spring为JDK Timer和Quartz Scheduler所提供的TimerFactoryBean和SchedulerFactoryBean能够和Spring容器的生命周期关联,在 Spring容器启动时启动调度器,而在Spring容器关闭时,停止调度器。所以在Spring中通过这两个FactoryBean配置调度器,再从 Spring IoC中获取调度器引用进行任务调度将不会出现这种Web容器关闭而任务依然运行的问题。而如果你在程序中直接使用Timer或Scheduler,如不 进行额外的处理,将会出现这一问题。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马