关于jsp的定时实现过程

夜霸儿

夜霸儿

2016-02-19 15:10

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享关于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>

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

    当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行,上面的代码会在Tomcat的日志文件中记录如下:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

    内容:
    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 指定任务执行结束

展开更多 50%)
分享

猜你喜欢

关于jsp的定时实现过程

Web开发
关于jsp的定时实现过程

JSP 动态树的实现

Web开发
JSP 动态树的实现

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

jsp实现购物程序

Java JAVA基础
jsp实现购物程序

关于JSP写文件的补充

Java JAVA基础
关于JSP写文件的补充

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

JSP登录验证功能的实现

Web开发
JSP登录验证功能的实现

JSP中图片验证的实现

Java JAVA基础
JSP中图片验证的实现

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Mysql入门系列:检查和维护MYSQL数据库表

Mysql入门系列:检查和维护MYSQL数据库表

用JSP处理Oracle中CLOB类型的字段

用JSP处理Oracle中CLOB类型的字段
下拉加载更多内容 ↓