关于jsp的定时实现过程


我把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 指定任务执行结束

本文作者:



相关阅读:
jquery ajax return没有返回值的解决方法
GHOST参数、命令操作指南
解析Linux特殊文件
CSS布局带来的巨大影响:CSS display属性值
Apache+Servlet+Jsp环境设置(中)
分页显示Oracle数据库记录的类之一
Exchange数据库执行可靠恢复操作
Vista破解激活七种方法
asp.net SqlDataAdapter对象使用札记
H标记要在网页制作中合理使用
javascript(对象.属性)集锦之三
XP文件路径显示调整为Vista风格
JSP编写WAP输入中文乱码问题
利用web服务实现自动完成输入
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 数学教师初中新学期工作计划 他只单单为她演绎了一场落幕繁华 天佑中国,人间有难 我的病人比尔.克林顿 人生箴言录 蚊子和土豆200字 惊叹作文350字 下棋500字 雪乡的早晨200字 农村社会养老保险交费有哪些方式 天蓝色的背包 回眸处尽是深情作文 我的童话 男性更年期的八大症状 耶稣的兄弟 Brother of Jesus 请允许我再任性的哭最后一次 缀满乌云的蓝天 参加“双高人才”培训后思想政治与业务工作总结 领导60岁生日贺词 励志故事《这也会过去》 汽车的不舒服 重民生者得民心,得民心都得天下 烦人的妹妹作文500字 《反对本本主义》 心里乐开了花……300字 从观念抓起,消除不文明现象 游向大海作文500字 2010年暑假调查活动总结报告 “8”=“发”吗作文900字 谣言在伟大的抗洪救灾战役中不堪一击 农业系统“五五”普法检查验收指导标准 《前四國論》 读书的趣味作文 大学会展专业联谊会策划书 论现在的学生为何不爱国 黑白作文2600字 为你泡脚 你为什么上大学 今世永远难“永远” 关于全民国防教育日活动方案 小学六年级作文550字:《秋思》诗改故事 小学六年级作文550字:游海南岛 农村工作要讲关系忌私情 情感日志心情随笔 小学六年级作文1500字:“131”地下工程 图形的争论 我的母校——马田小学作文100字 雨中一战 读半边 粮食系统表彰暨工作动员大会讲话

Copyright © 2016 phpStudy |