`

JAVA WEB服务监听与周期执行某一任务

阅读更多
说明:本人为菜鸟,此文主要用于记录个人学习笔记,也希望给予同时菜鸟的朋友一点帮助,文中解决方法有些采用了他人文章,感谢原创者的付出。由于其他原因,本人只给出本人查阅采用的文章链接,对于参考文章非该作者原创的情况,希望原创者能够理解。
应用背景:在做一个java web工程服务器为tomcat,里面有个功能大致要求如下,周期性的检查计算机目录下的某个文件是否更新,若更新则对该文件进行分析。
关键词:ServletContextListener;Timer;TimerTask
解决方法:
    搜索资料后,发现采用ServletContextListener接口能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener 来处理。这样我们可以根据这个特性实现在web应用程序初始化时,自动运行一些初始化程序。在 ServletContextListener 接口中定义了处理ServletContextEvent事件的两个方法。该接口中有两个主要方法:contextDestroyed()与contextInitialized(),前者由Servlet容器调用在web应用的“初始化”阶段,后者的调用在web应用的“结束”阶段。在部署ServletContextListene的时候,需要在web.xml中对相关参数进行配置,相关更详细地信息,可以自行搜索。现就本文具体代码进行分析。
首先是web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
   <listener>   
    <listener-class>Analyze</listener-class>
  </listener>  
  <context-param>
    <description>Analyze的监听周期以秒为单位</description>
  	<param-name>period</param-name>
  	<param-value>5</param-value>
  </context-param>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 </web-app>

<listener-class>用于设定执行监听的类,后面的<param-name>和<param-value>用来设定后续schedule()方法中所需的周期。

Analyze.java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class Analyze implements ServletContextListener {

	private static java.util.Timer timer = null;

	public void contextDestroyed(ServletContextEvent event) {
		timer.cancel();
		event.getServletContext().log("定时器已销毁,任务执行结束");
	}

	public void contextInitialized(ServletContextEvent event) {
		timer = new java.util.Timer(true);
		javax.servlet.ServletContext ctx = event.getServletContext();
		ctx.log("定时器已启动,任务开始执行");

		//读取web.xml配置文件中的参数值
		long period = Long.valueOf((String) ctx.getInitParameter("period"))
				.longValue() * 1000;
		timer.schedule(new NewTask(event.getServletContext()), 0, period);
		//schedule方法中三个参数各自意义:所需要执行的任务;延迟时间(0表示起动Web容器(或服务器)时就立即执行此任务);任务的执行间隔时间[单位:毫秒]
	}
}

Analyze类实现了ServletContextListener接口,实现了其中的两个方法,对于contextInitialized方法,主要说明的是,通过该方法,调用Timer类执行其schedule()方法,并读取web.xml中<context-param>
信息,作为参数放在Timer.schedule()方法中,并执行任务。对于Timer.schedule()方法需要说明一下:
schedule()方法根据参数的不同,带来的效果也不一样,主要说明如下:
schedule(TimerTask task, long delay)文档说明:Schedules the specified task for execution after the specified delay。大意是在延时delay毫秒后执行task,且只执行一次
schedule(TimerTask task, long delay, long period)的注释:Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay。大意是在延时delay毫秒后重复的执行task,周期是period毫秒。本文采用的是后者。
监听启动后,调用Timer类,利用schedule调用NewTask类,该类继承TimerTask类。

NewTask.java
import java.util.List;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import wstate.State;

public class NewTask extends TimerTask {
	public NewTask(ServletContext servletContext) {
		this.servletContext = servletContext;
	}

	private ServletContext servletContext = null;
	private static boolean isRunning = false; // 运行标志(表示是否正在运行计划的任务)

	@Override
	public void run() {
		if (!isRunning) { // 当未执行此任务时则开始执行
			List<State> l = NodesAnalysis.GetStates();
			if (l.size() != 0) {
				servletContext.setAttribute("states", l);
			}
			isRunning = false; // 将任务执行标志设置为执行完毕
		} else {
			System.out.println("任务正在运行中");
		}
	}
}

对于Timer和TimerTask的介绍,个人觉得http://hi.baidu.com/wmqxyh/item/a386395ba03db50ce6c4a5a9所写非常详细,贴出来,感谢该作者:
Timer与TimerTask都在java.util包中,它们是与任务调度相关的类。Timer是一个定时器,可以设置成在特定时间或按特定时间周期产生信号;TimerTask负责定义所要执行的任务。将Timer和TimerTask关联起来,在Timer发出信号的时候执行TimerTask定义的任务。 TimerTask是一个抽象类,只要继承TimerTask类并实现run()方法就行了。run()方法体就是定义所要执行的任务的地方,在Timer发出信号的时候,这个run()方法就会执行。要想知道本次run()方法再何时被启动,可以使用TimerTask类中的方法long scheduledExecutionTime(),使用这个方法不会造成时间精度的误差,它比System.currentTimeMillis()更节省资源。 可以通过Timer类的schedule(...)方法来设定发出信号的特定时间或特定时间周期,并与一个TimerTask类的实例相关联。使用void scheduleAtFixedRate(...)方法可以产生固定周期信号。可以使用Timer类的cancle()方法停止Timer,不再发出信号,此时,Timer与TimerTask也就脱离关系了。也可以通过TimerTask类中的cancle()方法达到同样的目的。 有一个问题,如果run()方法里面的任务在下一次信号出现之前还没有完成怎么办?有下面两种情况:(1)在用schedule(...)方法调度时:如果run()方法里面的任务在信号周期之内完成,那么下一次的信号就会在预定的时间产生;如果run()方法里面的任务在下一次信号出现之前还没有完成,那么下一次的信号就会延迟,并且上一个run()执行完成之后就立即产生下一个信号,下一个run()立即开始执行。(2)在用scheduleAtFixedRate(...)方法调度时:如果run()方法里面的任务在信号周期之内完成,那么下一次的信号就会在预定的时间产生;如果run()方法里面的任务在下一次信号出现之前还没有完成,那么等到run()执行完成之后,下一次的信号产生就尽量赶上本应该产生信号的时间,意思就是如果有累计的(从第一次信号算起)超时存在,那么下一次的信号就会在run()方法执行完之后立即产生;如果没有累计的超时存在,那么就按照周期产生信号。 另外,根据规范,如果调用cancle()时run()仍在执行,那么run()会继续执行直到完成。
感谢以下作者的辛勤劳动。
http://www.cnblogs.com/soarwell/archive/2009/03/18/1415206.html
http://www.cnblogs.com/secret1998/archive/2010/05/26/1744432.html
http://blog.csdn.net/blueling51/article/details/6931026
http://hi.baidu.com/wmqxyh/item/a386395ba03db50ce6c4a5a9
分享到:
评论

相关推荐

    java web使用监听器实现定时周期性执行任务demo

    Java Web 使用监听器实现定时周期性执行任务是一种常见的需求,特别是在服务器端需要定期进行某些维护操作,例如数据备份、清理过期数据或者发送通知。在这个"java web使用监听器实现定时周期性执行任务demo"中,...

    简单JAVA WEB服务器

    本项目“简单JAVA WEB服务器”旨在提供一个基础的平台,帮助学习者理解Java Web服务器的工作原理,特别是静态网页服务和JSP(Java Server Pages)的执行,以及Cookie的解析。 1. **多线程技术**:Java Web服务器...

    java定时任务,每天定时执行任务

    Java 定时任务,每天定时执行任务 Java 定时任务是指在 Java 语言中实现的定时执行任务的机制,通过使用 Timer 和 TimerTask 两个类,可以实现定时执行任务的功能。在这个例子中,我们将实现每天定时执行任务的功能...

    Java Web 服务器原理

    Java Web服务器原理主要涉及到Web应用的部署、运行和管理,其中Tomcat是一个广泛使用的开源Java Servlet容器,它是Java EE(现在称为Jakarta EE)的一部分。本文将深入探讨Java Web服务器的工作原理,特别是Tomcat的...

    JAVA自动执行任务

    JAVA自动执行任务是指在WEB工程中实现自动执行任务的功能,通过使用Servlet上下文相关的侦听器和Java定时器来实现。下面是相关知识点的详细解释: 1. Servlet上下文相关的侦听器 在WEB工程中,Servlet上下文相关...

    纯java写的web服务器

    这种服务器的核心原理是基于Java的Socket编程,通过创建服务器端套接字监听客户端的连接请求,然后进行数据交换,实现Web服务的功能。 首先,我们来深入理解Java服务器的工作原理。在Java中,服务器通常会创建一个...

    java web在线人数统计/监听

    总结,Java Web在线人数统计通过监听Session生命周期,结合适当的存储和显示机制,可以实现高效且实时的在线用户数量统计。理解这一机制对于提升Web应用的用户体验和优化服务器资源管理至关重要。

    《Java Web程序设计任务教程》-教材源码第6章.rar

    在《Java Web程序设计任务教程》中,第六章主要涵盖了Java Web开发的关键概念和技术,旨在帮助读者深入理解如何构建动态、交互式的Web应用程序。这一章节的内容可能会包括以下几个方面: 1. **Servlet技术**:...

    web监听器代码--监听servlet

    Web监听器是Java Web应用程序中的一个重要组件,它们允许开发者在特定事件发生时执行代码,比如在Servlet上下文初始化或销毁时、用户会话创建或结束时等。在Java Web开发中,监听器通过实现特定接口并配置在`web.xml...

    java web定时任务 实例

    Java Web定时任务是Web应用程序中实现周期性操作的关键技术,例如数据备份、清理过期记录、发送邮件通知等。在本实例中,我们将探讨如何在Java Web环境中设置和执行定时任务,以及涉及到的相关技术和工具。 首先,...

    经典 java web例子

    Java Web是一种基于Java技术构建Web应用程序的框架和标准,它结合了Java服务器页面(JSP)、Servlet、JavaServer Faces(JSF)等组件,为开发人员提供了强大的后端支持和丰富的用户界面创建工具。本教程将围绕“经典...

    java web学习课件

    J2EE(Java 2 Platform, Enterprise Edition)是Oracle公司提供的一个企业级应用开发框架,它包括了多种服务、接口和组件,用于构建分布式、多层的企业级应用程序,特别是Web应用。 在描述中提到的"web_servlet...

    tomcat和java web源码

    1. **Servlet基础**:包括Servlet的生命周期、初始化、服务、销毁方法,以及如何通过`@WebServlet`注解或`web.xml`文件来注册Servlet。 2. **JSP基础**:展示如何在JSP页面中使用EL(Expression Language)和JSTL...

    Java Web 整合开发 完全自学手册 源代码

    《Java Web 整合开发 完全自学手册》是一本深度探讨Java Web技术的书籍,由白广元编著。这本书旨在帮助读者全面掌握Java Web应用程序的开发技能,从基础到高级,涵盖了一系列核心概念和技术。通过源代码的学习,读者...

    Java Web开发实践教程 课件

    Java Web开发实践教程是一门深度探索Java在Web领域应用的课程,旨在帮助学习者掌握从基础到高级的Java Web开发技术。本课程涵盖了广泛的主题,包括Servlet、JSP、MVC框架(如Spring MVC)、数据库交互、过滤器、监听...

    基于Java的Web服务器工作原理

    Java Web服务器通常会有一个Servlet容器,例如Tomcat、Jetty或GlassFish,它们负责加载、管理并执行Servlet。 当客户端发送一个HTTP请求到Java Web服务器时,以下是一般的工作流程: 1. **网络连接**:客户端(如...

    Tomcat与Java Web开发技术详解(第2版).pdf

    《Tomcat与Java Web开发技术详解(第2版)》是一本深入探讨Java Web应用程序部署和运行环境的权威指南。本书主要围绕Apache Tomcat服务器展开,涵盖了从基础概念到高级特性的全方位讲解,旨在帮助读者掌握Java Web...

    Tomcat与Java Web开发技术详解源代码.rar

    《Tomcat与Java Web开发技术详解》是一本深入解析Tomcat服务器和Java Web开发的经典教程。书中通过丰富的实例,详细介绍了如何使用Tomcat作为应用服务器进行Web应用的部署和管理,以及如何使用Java语言和相关技术来...

    java web server

    4. **JSTL(JavaServer Pages Standard Tag Library)**:JSTL提供了一系列标签库,用于在JSP页面中执行常见的任务,如循环、条件判断等,提高了代码的可读性和可维护性。 5. **MVC(Model-View-Controller)**:这...

    JAVA SESSION监听器

    Java Session监听器是Java Servlet规范中提供的一种机制,用于对HttpSession对象的生命周期事件进行监听和处理。在Web应用程序中,Session是用来跟踪用户状态的重要工具,特别是在无状态的HTTP协议上。当用户登录后...

Global site tag (gtag.js) - Google Analytics