如何在Web工程中实现任务计划调度

如何在Web工程中实现任务计划调度,第1张

如何在Web工程中实现任务计划调度,第2张

很多朋友都用过Windows的任务计划,也有很多程序迷写过时钟报警、系统自动关机等有趣的程序,但是很少有朋友在Web工程中实现过类似的功能。今天空把之前作者在Tomcat上实现的类似功能搬出来和大家分享一下。

早在几年前,我们公司就和某市财政局合作项目开发。为了加强财政局对所属单位财务状况的有效监管,我们开发实施了财政局数据中心项目。本项目采用B/S和C/S混合结构模式,在财政局Web服务器上设置数据同步接收设备,市级单位每天下班前通过HTTP协议将财务信息上传到财政局中心服务器,并与Web服务器上的接收设备连接。财政局内设部门需要查阅大量的财务资料,以获得完整的市级单位财务现状信息。各部门按照职能划分,需要准确获取各部门关注的汇总信息,并以财务报表的形式提供。

由于财务数据量大,财务报表实时计算速度慢,一开始就考虑了报表缓存,以减轻服务器负担,但需要合理的缓存更新机制。考虑到各市直单位每天下班前上传财务数据,财政局每天查看的财务信息实际上不包括当天的(除非某领导等到所有下属单位都上传完信息,那应该已经下班了),所以如果能实现任务调度,每晚半夜汇总当前和历史财务信息,更新缓存,速度瓶颈就能解决。

当时系统的核心是基于Web部署的,报表计算引擎也相应的部署在Tomcat容器上。所以,如果想借用Windows的任务计划来实现预定计算,就需要额外编写一个通用的桌面应用程序接口,略显复杂。所以我想在网络上实现它。在查阅了更多相关资料后,我发现Java timer (java.util.Timer)有定时触发计划任务的功能。通过配置定时器的间隔时间,预定的调度任务(java.util.TimerTask)会在一定间隔后自动定时调用。此外,因为我们希望计时器在Web项目启动时自动启动,所以计时器可以在Web项目的整个生命周期中每晚触发一次报表计算引擎。所以定时器的存放位置也值得考察。它不能简单地存在于单个Servlet或JavaBean中。它必须能够使计时器的生存期托管Web项目的整个生存期,并且在项目启动时可以自动加载运行。综合这两点,Servlet上下文相关的监听器是最合适的。通过在项目的配置文件中进行适当的配置,它会在项目启动时自动运行,并在项目的整个生命周期内处于监听状态。

下面描述Servlet listener结合Java timer的整个实现过程。要使用Servlet listener,我们需要实现javax . Servlet . servletcontextlistener接口,同时实现它的两个接口函数,即Context Initialized(servletContextEvent事件)和Context Destroyed(servletContextEvent事件)。考虑到定时器有一个建立和销毁的过程,看了前两个接口函数,把建立过程放入contextInitialized,销毁过程放入contextDestroyed,这是毋庸置疑的。

我将ServletContextListener的实现类命名为ContextListener,并在其中添加了一个计时器。示例代码如下(因篇幅原因,仅提供部分代码供读者参考):

private Java . util . timer timer = null;
public void context initialized(ServletContextEvent事件){
timer = new Java . util . timer(true);
event.getServletContext()。log("计时器启动");
timer . schedule(new my task(event . getservletcontext()),0,60 * 60 * 1000);
event.getServletContext()。log("已添加任务计划");
}
public void context destroyed(ServletContextEvent事件){
timer . cancel();
event.getServletContext()。log("计时器被破坏");
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 如何在Web工程中实现任务计划调度

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情