关于jsp的定时实现过程

2016-02-19 15:10 7 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享关于jsp的定时实现过程吧。

【 tulaoshi.com - Web开发 】

  我把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("定时器销毁");
    }

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

    以上代码中, 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 指定任务执行结束

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

来源:http://www.tulaoshi.com/n/20160219/1609058.html

延伸阅读
代码如下: public static void shutdown(){          System.out.print("请输入多少分钟后关机:");          Scanner scanner = new Scanner(System.in);          int minute = scanner.nextInt()*60;  &nb...
标签: Java JAVA基础
全文检索一直都是web方面的关键技术,如何在浩如烟海的信息中找到自己想要的信息是人们最关心的。鼎鼎大名的GOOGLE就是一个很成功的例子,网络上的人们大部分都用GOOGLE来查找自己需要的内容。全文检索主要有两个技术指标:快速和精确。前一段时间做了一个新闻系统,老板要加上全文检索的功能,想了很久才用一个不太高明的方法实现了。现在分享...
很久之前就想给Vckbase写点什么东西了,毕业至今,在vckbase中学了不少东西,也拿了不少代码,今天决定要回报一下,不管老婆呆会会不会拧我耳朵了。 毫秒定时器,为什么要使用毫秒定时器呢?我想原因有两个。第一:CWnd里面的timer不能精确到毫秒级,所以必须要写一个精确到毫秒级的。第二:用CWnd里面的timer代价太大,因为有时我们的类根本就...
标签: Java JAVA基础
  在jsp中,中文乱码常会让人心乱如麻。 对于中文处理的常见对策,在网上经常可见的主要是下面2种: <%@ page contentType="text/html;charset=gb2312" %>   或者: <% String Hi="你好"; byte[] tmpbyte=Hi.getBytes("ISO8859_1"); Hi=new String(tmpbyte); out.pr...
标签: Java JAVA基础
  1.可以使用: response.sendRedirect("http://www.foo.com/path/error.html"); 2.可以手工修改HTTP header的Location属性,如下: <% response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); String newLocn = "/newpath/index.html"; response.setHeader("Location",newLocn); %> 3.也可以使用...

经验教程

400

收藏

25
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部