原文地址:http://coach.iteye.com/blog/854996
Web应用程序中调度器的启动和关闭问题
我们知道静态变量是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,如不 进行额外的处理,将会出现这一问题。
其实定时任务都是开启的线程,如果能把开启的线程都设置成守护线程,那么也行。
相关推荐
嵌入式 Linux 应用程序开发详解之多线程编程 Linux 中的线程编程是指在 Linux 操作系统中使用线程来实现多任务处理的编程技术。线程是一种轻量级进程,它可以共享同一个进程的资源,例如文件描述符和信号处理。与...
HTML5的Web线程,全称为Web Workers,是HTML5引入的一个强大特性,旨在提高Web应用程序的性能和响应性。Web Workers允许在浏览器后台独立于主线程运行脚本,处理大量计算任务,避免了因为JavaScript执行阻塞而导致的...
在IT领域,多线程定时器是一个非常实用的工具,特别是在开发Web应用程序和Windows桌面应用(Winform)时。这个工具允许程序员在多个线程环境中设置定时任务,从而实现后台处理、定期检查更新或者执行一系列间隔操作...
总结来说,这个实验涵盖了HTTP基础、多线程Web服务器的实现以及Java RMI的应用,这些都是构建复杂网络应用程序的基础。每个部分都至关重要,理解和掌握它们对于成为一名合格的IT专业人士至关重要。通过实践,你可以...
`WebDelegate_线程(在Web中使用线程+委托)`这个主题探讨的就是如何在Web应用中有效地利用线程和委托。 首先,线程是操作系统提供的一个基础概念,它代表程序中的执行单元。在Web应用中,我们可以创建新的线程来执行...
最后,Java多线程技术在WebGIS客户端小程序中的应用还涉及到线程安全和同步问题。由于多个线程可能同时访问和修改数据,这可能导致数据不一致的问题。为此,Java提供了synchronized关键字、锁机制等同步工具来保证...
1. 用户级线程:用户级线程由应用程序管理,操作系统内核对它们的创建、调度和销毁并不直接参与。用户级线程的切换速度快,但当某个线程遇到I/O阻塞时,整个进程的其他线程也会被阻塞。 2. 内核级线程:内核支持的...
Web API通常指的是应用程序接口,它们允许不同的服务之间进行通信,以实现数据交换和功能整合。多线程并发测试则是验证在多个线程同时访问API时,系统的性能、稳定性和正确性。 描述中的“WEB API 多线程并发测试...
在计算机程序设计中,多线程允许一个应用程序同时执行多个不同的任务,提高资源利用率和响应速度。在Web服务器中,多线程技术可以使得服务器同时处理多个客户端的请求,提升服务效率。C++标准库提供 `<thread>` ...
5. **MVC(Model-View-Controller)设计模式**:在Java Web开发中,MVC模式被广泛应用于组织应用程序结构。了解模型、视图和控制器各自的角色,以及它们之间的交互,有助于构建清晰的项目架构。 6. **Struts框架**...
`server2.exe`可能是使用`pyinstaller`工具打包后的Python应用程序,`pyinstaller`是一个用于将Python脚本转换为独立可执行程序的工具,这使得该Web服务器可以在不安装Python环境的机器上运行,极大地提高了其便携性...
然而,从零开始编写多线程Web服务器是学习网络编程和并发处理的好方法,可以深入理解这些底层概念。 在压缩包中的"Server"文件可能是服务器的主类,它启动服务器监听端口,并可能包含了配置信息,如监听的IP地址和...
在IT行业中,多线程调用Web服务是一种常见的性能优化技术,特别是在处理大量并发请求时。Web服务,通常指的是基于SOAP、REST等协议...通过深入理解这些概念和技术,开发者可以构建出能够应对高并发场景的健壮应用程序。
教你怎么开发线程安全的SpringWeb应用.
例如,如果在Web应用中需要读取和处理一个非常大的本地文件,传统的做法可能会让整个页面卡死,而通过Web Workers可以将文件处理逻辑放在后台线程执行,主线程则负责接收处理进度和结果,这样既保证了操作的流畅性,...
在IT领域,多线程是程序设计中的一个重要概念,它允许程序同时执行多个任务,显著提高了计算机系统的效率和响应速度。C++Builder是一款强大的集成开发环境(IDE),它支持C++语言,为开发者提供了创建多线程应用的...
.Net线程的基础及问题涉及到多个关键概念,包括线程创建、线程类型、异步编程、WinForm多线程、线程池、同步机制以及在Web和IIS环境中的线程应用。 首先,创建线程有多种方式。最常见的是通过`Thread`类,创建一个`...
【Android开发教程之使用Web Workers来加速您的移动Web应用程序】 Web Workers是HTML5引入的一项重要技术,它允许在Web应用程序中实现多线程处理,从而改善了JavaScript在移动设备上的性能。一直以来,JavaScript...
总之,用C++开发Web商用程序是一项挑战,但通过掌握上述关键知识点和工具,开发者可以充分利用C++的优势,创建出高效、安全且易于维护的Web应用程序。在实践中不断学习和迭代,是成为一名优秀的C++ Web开发者的...
在 Linux 下的多线程服务器程序设计中,需要使用互斥锁来解决线程间的同步问题。互斥锁是一种同步机制,用于保护共享资源免受多个线程的同时访问。Linux 提供了多种互斥锁机制,包括信号量、互斥锁、条件变量等。 ...