转:http://blog.sina.com.cn/s/blog_517aff8b0100cier.html
下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现
javax.servlet.ServletContextListener接口,同时实现它的contextInitialized
(ServletContextEvent event)和contextDestroyed(ServletContextEvent
event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入
contextInitialized,把销毁的过程置入contextDestroyed了。
我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示(为考虑篇幅,仅提供部分代码供读者参考):
private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);
event.getServletContext().log("已经添加任务调度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
}
以 上代码中, timer.schedule(new MyTask(event.getServletContext()), 0,
60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从
java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟。
其它代码相当简单,不再详细说明。
下面介绍MyTask的实现,上面的代码中看到了在构造MyTask时,传入了
javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载MyTask的构造函数(其父
类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实
现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下
来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代
码如下所示:
private static final int C_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public MyTask(ServletContext context) {
this.context = context;
}
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定任务");
//TODO 添加自定义的详细任务,以下只是示例
int i = 0;
while (i++ < 10) {
context.log("已完成任务的" + i + "/" + 10);
}
isRunning = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
}
上面代码中"//TODO……"之下四行是真正被调度执行的演示代码(在我的财政数据中心项目中就是报表计算过程),您可以换成自己希望执行的语句。
到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:
<listener>
<listener-class>com.test.ContextListener</listener-class>
</listener>
当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行,上面的代码会在Tomcat的日志文件中记录如下:
2003-12-05 0:21:39 开始执行指定任务
2003-12-05 0:21:39 已完成任务的1/10
……
2003-12-05 0:21:39 已完成任务的10/10
2003-12-05 0:21:39 指定任务执行结束
分享到:
相关推荐
JAVA自动执行任务是指在WEB工程中实现自动执行任务的功能,通过使用Servlet上下文相关的侦听器和Java定时器来实现。下面是相关知识点的详细解释: 1. Servlet上下文相关的侦听器 在WEB工程中,Servlet上下文相关...
在Web应用程序中,可以利用Servlet侦听器结合`Timer`来实现更复杂的定时任务。例如,可以在应用启动时初始化`Timer`,并在应用关闭时销毁它,以确保资源的正确管理。 ```java import javax.servlet....
在JavaServer Pages (JSP) 中,Servlet技术是不可或缺的一部分,它提供了服务器端处理动态内容的能力。而过滤器(Filter)和侦听器(Listener)是Servlet规范中的两个重要概念,它们增强了应用的功能和灵活性。 **...
Servlet上下文和侦听器
过滤器通过实现`javax.servlet.Filter`接口并配置在`web.xml`中来定义。在请求到达目标Servlet之前,过滤器链会被逐个调用,每个过滤器可以修改请求或响应,甚至阻止请求继续传递。 侦听器(Listener)则是Servlet...
在IT行业中,Servlet和JSP是Java Web开发中的重要组成部分,它们被广泛用于构建动态、交互式的Web应用程序。本项目“Servlet+jsp简单购物车”就是利用这两种技术来实现一个基础的在线购物车功能,这将涉及到HTTP请求...
总的来说,多线程TCP/IP侦听器在VB.NET中的实现涉及到网络编程、线程管理和并发处理等多个知识点。理解并掌握这些概念对于开发高效、可扩展的网络服务至关重要。在实际项目中,我们还需要考虑错误处理、资源管理、...
它提供了两种主要方式来实现自动化部署:命令行工具和Java Servlet侦听器。 **1. 命令行工具** Adobe LiveCycle Deployer的命令行工具使得管理员能够通过脚本或者在不交互的情况下部署和管理LiveCycle的应用和服务...
通过上述介绍,我们了解了多线程TCP/IP侦听器在VB.NET中的实现方式及其工作原理。实际开发中,开发者可以根据具体需求调整和优化代码,以构建高效稳定的服务器应用程序。提供的"代码中国.txt"可能包含了具体的VB.NET...
在这个“TCPServer_等待tcp侦听器_TcpServer_islandqdt_everyvom_”的场景中,我们关注的核心知识点是TCP服务器的构建、工作原理以及如何实现实时的消息交互。 1. **TCP协议基础**:TCP(Transmission Control ...
具体配置方法将在12.3节“为JMS侦听器配置WebSphere”中说明。 #### 四、配置WebSphere JNDI命名空间 **4.1 系统准备** 确保系统环境已经正确配置,并且所有必需的文件都放置在适当的目录下。具体步骤包括但不限于...
Filter 为过滤器, WEB 开发中通过 Filter 技术,对 web 服务器管理的所有 web 资源进行拦截,从而实现一些特殊的功能。 实现 Filter 需要: * 实现 Filter 接口,并实现其 doFilter 方法。 * 在 web.xml 文件中...
可将每一次侦听任务过程中的所有数据导出为单一的会话文件文件供日后导入分析使用,也可以 将每个视图窗口的内容导出为RTF标准格式文档以及普通文本,为用户在多种场合下使用数据提供了方便。 <br>SerialTrace还...
注释方法以用作传感器事件的侦听器。 有四种可能的注释:@OnSensorChanged、@OnAccuracyChanged、@OnSensorNotAvailable和@OnTrigger。带注释的方法必须具有Sensors Overview Android 文档中指定的方法签名。 有关...
为了支持侦听器,对象需要维护一个已登记的侦听器列表,提供侦听器登记和取消登记的手段,并在适当的事件发生时调用每个侦听器。使用和支持侦听器很容易,但是在登记接口的两边都应当避免一些缺陷。侦听器涉及的任何...
- **定时器**: 定时器是时间类型侦听函数的基础,它允许程序在特定时间间隔后执行某项任务。常见的定时器API有JavaScript中的`setTimeout`和`setInterval`,C++中的`std::chrono`库等。 - **事件驱动编程**: 事件...
在AS2(ActionScript 2.0)中,事件处理是动态交互系统的重要组成部分,而事件侦听器是实现这一机制的关键。事件侦听器允许我们响应特定的事件,如用户点击、对象加载等,而无需不断检查这些事件是否已经发生,这与...
java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象...
在Java编程中,异步处理和监听模式是提高应用程序性能和响应能力的重要技术。本文将深入探讨这两个概念,以及如何利用它们来优化程序设计。 **异步处理** 是一种编程模型,它允许程序中的某个任务在后台运行,不...