好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过时钟报警、系统自动关机等趣味程序,可却很少有朋友在Web工程中实现过类似功能。
当Web工程启动时,定时器能自动开始计时,在整个Web工程的生命期里,定时器能在每晚深夜触发一次任务。因此定时器的存放位置也值得考查,不能简单的存在于单个Servlet或JavaBean中,必须能让定时器宿主的存活期为整个Web工程生命期,在工程启动时能自动加载运行。结合这两点,跟Servlet上下文有关的侦听器就最合适不过了,通过在工程的配置文件中加以合理配置,会在工程启动时自动运行,并在整个工程生命期中处于监听状态。
下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。
我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示:
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class ContextListener
extends HttpServlet
implements ServletContextListener {
public 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。示例代码如下所示:
import java.util.*;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.*;
public class MyTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public MyTask() {
}
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 添加自定义的详细任务,以下只是示例
//系统定时接收邮件
Email email=new Email();
email.recieve();
isRunning = false;
context.log("指定任务执行结束");
}
}
else {
context.log("上一次任务执行还未结束");
}
}
}
到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:
<listener>
<listener-class>com.test.ContextListener</listener-class>
</listener>
当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行。
分享到:
相关推荐
这在集群环境中的多个Tomcat服务器部署WebReport工程时特别有用,因为可以将工程部署在不同的服务器上。对于共享式集群,可以通过配置共享式文件系统来实现所有节点对同一存储空间的访问。 在环境准备阶段,首先...
2. **部署到Tomcat**:在MyEclipse中,选择“Server”视图,然后右键点击Tomcat服务器 -> “Add and Remove”。在弹出的对话框中,选择xxl-job-admin项目,点击“Finish”。 **启动Tomcat并验证**: - 启动Tomcat...
在传统的Servlet 2.x环境中,可以使用`ServletContextListener`监听器,在`contextInitialized`方法中启动任务调度。而在Servlet 3.0及以上版本,可以利用`@WebServlet`或`@WebListener`注解。例如: ```java @Web...
在"Spring2.5+Quartz定时任务简单例子web工程"中,我们可以看到这两个框架的结合使用,主要目标是实现基于 Web 应用的定时任务管理。以下将详细介绍这个项目中可能涉及的知识点: 1. **Spring 2.5**: - **依赖...
在本文中,我们将深入探讨如何将Kettle Manager集成到Web页面中,实现远程的作业调度。 一、Kettle Manager介绍 Kettle Manager作为Kettle的核心组件,提供了图形化的作业和转换设计环境,以及作业和转换的执行监控...
- **环境搭建**:确保Java环境正确安装,并配置好Tomcat服务器。 #### 九、总结 通过本文的介绍,我们可以看出Tomcat是一款功能强大且高度可配置的Servlet容器。无论是初学者还是经验丰富的开发者,都可以从本书中...
3. **任务调度**:根据任务需求、车辆和驾驶员状况,智能调度车辆,规划最优路线。 4. **实时监控**:跟踪车辆位置,提供实时调度决策支持。 5. **报表统计**:生成各类统计报表,如车辆使用率、任务完成情况、成本...
本范例主要展示了如何在Java线程和Web环境中使用Quartz来实现任务调度。 首先,让我们深入了解一下Quartz的核心概念: 1. **Job**: Job是Quartz中的基本工作单元,代表一个具体的任务。开发者需要创建一个实现了`...
Quartz是一款广泛使用的开源作业调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在分布式环境中,尤其是在高可用性和负载均衡需求的场景下,Quartz可以通过集群配置实现任务的共享和均衡。本配置手册将...
他还利用ThreadLocal实现页面分页,JSTL和自定义函数处理JSP页面,DWR处理授权,JBPM实现工作流程,Freemarker进行动态表单设计,Quartz用于任务调度,如考勤管理和工资计算。他在项目中负责系统分析设计、分页组件...
在这个“springboot聚合工程”中,我们可能会看到一系列的子模块,每个子模块专注于特定的功能或服务,从而实现模块化、可重用和可扩展的代码结构。 首先,让我们深入了解SpringBoot的核心特性。SpringBoot旨在简化...
- **任务调度**:掌握Quartz任务调度框架。 - **消息队列**:熟悉ActiveMQ消息队列技术。 - **搜索引擎**:了解ElasticSearch搜索引擎。 - **缓存管理**:接触过Redis缓存管理系统,处理分布式缓存和集群下session...
通过这样的实践,学生可以提升对微服务架构的理解,以及在实际项目中如何处理定时任务的调度和管理。 【标签】"SpringBoot java"说明项目的核心技术栈是Java和SpringBoot。Java作为广泛使用的服务器端编程语言,与...
该项目计划书主要针对一个名为BUS系统的软件开发,旨在提升公交公司的运营调度效率,实现公交运营的智能化和信息化。系统由某市软件公司受某市公交部门委托,市政府提出任务,目的是优化公共交通服务,解决城市交通...
系统部署通常在服务器上进行,可以选择Tomcat、Jetty等应用服务器。运维方面,考虑日志管理、性能监控、安全防护和备份恢复等环节,确保系统的稳定运行。 综上所述,基于SSM框架的建筑维修工程项目管理系统是一个...
3. 服务器:Kettle Server运行在后台,处理由Web平台提交的ETL任务,可能使用Tomcat或Jetty等应用服务器。 4. 存储:利用MySQL、PostgreSQL等数据库存储元数据和用户配置,而大数据处理可能依赖于Hadoop HDFS或NoSQL...
8. **部署与运行**: 最终,这个工程实例需要打包成WAR文件,部署到如Tomcat这样的Java应用服务器上,然后用户可以通过浏览器访问并使用这个基于Ext Gantt的项目管理应用。 综上所述,"Ext Gantt + jsp + servlet ...
【jbpm4.4-请假流程】是一个基于Java开发的流程引擎示例,主要用于演示如何在企业级应用中实现请假流程。jbPM是Java Business Process Management的缩写,它是一个开源的工作流和业务流程管理系统,提供了对BPMN 2.0...
3. **MyEclipse使用技巧**:在MyEclipse中,创建Java工程,设置正确的构建路径,导入所需的库,编写源代码,并配置服务器环境,如Tomcat或Jetty,以便于运行和测试短信工程。使用MyEclipse的调试工具可以有效地定位...
- 在线教育平台项目,基于Spring Boot和Spring Cloud微服务架构,涉及多数据库如MySQL、MongoDB、Redis和ElasticSearch,使用Spring Data JPA、MyBatis等进行数据访问,还涉及分布式任务调度和微服务治理。...