我们知道静态变量是ClassLoader级别的,如果Web应用程序停止,这些静态变量也会从JVM中清除。但是线程则是JVM级别的,如果你在Web 应用中启动一个线程,这个线程的生命周期并不会和Web应用程序保持同步。也就是说,即使你停止了Web应用,这个线程依旧是活跃的。正是因为这个很隐晦 的问题,所以很多有经验的开发者不太赞成在Web应用中私自启动线程。
如果我们手工使用JDK Timer(Quartz的Scheduler),在Web容器启动时启动Timer,当Web容器关闭时,除非你手工关闭这个Timer,否则Timer中的任务还会继续运行!
下面通过一个小例子来演示这个“诡异”的现象,我们通过ServletContextListener在Web容器启动时创建一个Timer并周期性地运行一个任务:
//代码清单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容器监听器:<?xml version="1.0" encoding="UTF-8"?>
<web-app>
…
<listener>
<listener-class>com.baobaotao.web.StartCycleRunTask</listener-class>
</listener>
</web-app>
在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,如不 进行额外的处理,将会出现这一问题。
分享到:
相关推荐
在Web应用程序开发中,有时我们需要在应用程序启动时自动运行某些服务或任务,例如定时任务、数据同步等。本文将介绍一种利用Servlet上下文监听器(ServletContextListener)和开源任务调度框架Quartz来实现后台任务...
Quartz 是一个开源的作业调度框架,常用于Java Web应用程序中进行定时任务的管理。它提供了高度可配置性,能够灵活地安排、管理和执行任务,是企业级应用中不可或缺的一部分。这篇博客文章“quartz 在WEB中应用小结...
在Web应用程序中集成Quartz,可以实现后台任务的自动化处理,比如数据同步、报表生成、邮件发送等。这篇博客“quartz单机和WEB应用”可能是探讨如何在单机环境下配置和使用Quartz,以及如何在Web应用中集成Quartz来...
Quartz.NET是一款开源的作业调度框架,支持.NET平台,它允许开发者在应用程序中安排任务的执行。其设计灵感来源于Java的Quartz项目,提供了强大的定时任务管理和并发处理能力。Quartz.NET通过Job和Trigger的概念,...
- 在Java Web应用中,需要在web.xml中配置Quartz的监听器(org.quartz.ee.servlet.QuartzInitializerServlet)以启动调度器。 - 配置quartz.properties文件,设定数据库存储Job和Trigger(如果选择使用数据库存储...
Quartz是一款开源的作业调度框架,它允许开发者在Java应用程序中定义和执行复杂的定时任务。在Web应用中集成Quartz,可以实现定时触发各种业务逻辑,例如数据清理、报告生成、邮件发送等自动化操作。 首先,理解...
当Web应用程序启动时,Tomcat或Jetty等容器会触发此监听器,进而加载Spring的配置信息,创建ApplicationContext,使得Spring框架能够接管应用程序的生命周期管理。 2. **过滤器(Filter)** 过滤器在HTTP请求和...
Quartz,则是一个功能强大的作业调度库,允许开发者在应用程序中安排任务的执行。 在将 Spring 2 与 Quartz 整合到 Web 应用中时,主要涉及以下几个关键知识点: 1. **Spring 2 的核心概念**:Spring 2 提供了 IoC...
在Java Web应用程序中,监听器是实现了特定接口的类,它们可以在特定事件发生时被调用。例如,ServletContextListener可以在Web应用启动和停止时执行代码,HttpSessionListener可以监听会话的创建和销毁。在这个场景...
- 如果项目是Web应用,需要考虑在Web容器启动和停止时正确地启动和关闭Scheduler。 通过这个简单的Quartz demo,你可以学习到如何在Java项目中集成Quartz,创建和调度任务。在实际开发中,你可以根据项目需求调整...
Quartz 是一个开源的作业调度框架,常用于Java应用程序中实现定时任务的管理。它提供了丰富的API和功能,使得开发者可以灵活地定义和控制任务的执行。本篇将重点介绍如何在Web环境中集成并使用Quartz,以及相关的...
4. **持久化(Persistence)**:Quartz.Net支持数据库和其他持久化机制来保存作业和触发器的状态,即使应用程序关闭,也能确保任务不会丢失。 使用Quartz.Net的步骤: 1. **安装**:可以通过NuGet包管理器在项目中...
Quartz是一款开源的作业调度框架,它允许在Java应用程序中创建和执行定时任务。在Web项目中使用Quartz,可以实现后台任务的自动化执行,比如数据同步、日志清理、发送邮件等,无需用户手动触发。下面将详细介绍如何...
为了在Web应用程序关闭时保持任务的执行,可以使用Quartz.NET的`IScheduler`实例在Application_Start事件中启动,而在Application_End事件中停止。同时,由于Web应用程序生命周期的特性,可能需要考虑任务的持久化,...
Java Web定时任务是Web应用程序中实现周期性操作的关键技术,例如数据备份、清理过期记录、发送邮件通知等。在本实例中,我们将探讨如何在Java Web环境中设置和执行定时任务,以及涉及到的相关技术和工具。 首先,...
因此,需确保在Web应用启动时创建`Timer`,并在关闭时取消所有任务并停止`Timer`,以防止内存泄漏。 3. **异常处理**:`TimerTask`的`run()`方法没有直接抛出异常的机制,如果`run()`方法内部抛出未捕获的异常,会...
此外,Quartz.NET还支持持久化,这意味着即使应用程序关闭,已调度的作业和触发器信息也能保存下来,当应用程序重新启动时,可以恢复之前的调度状态。这通常通过数据库存储实现,例如SQL Server、MySQL或者SQLite等...
Quartz 提供了一个 Web 应用程序 `qts-web`,可以用于查看和管理调度的任务。此外,Spring 提供了 `QuartzJobBean`,它允许你使用 Spring AOP 来记录日志或处理异常。 ### 8. 高可用与集群 在分布式系统中,Quartz...
6. **关闭Scheduler**:在Web应用关闭时,记得调用`scheduler.shutdown()`来停止调度器,防止资源泄露。 7. **监控与管理**:Quartz提供了丰富的API和界面工具,可以帮助我们监控和管理任务执行状态,如查看日志、...