关于jsp的定时实现过程

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

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

【 tulaoshi.com - Web开发 】

  我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示(为考虑篇幅,仅提供部分代码供读者参考):

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

    代码:      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("定时器销毁");
    }

(本文来源于图老师网站,更多请访问https://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 指定任务执行结束

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

延伸阅读
很久之前就想给Vckbase写点什么东西了,毕业至今,在vckbase中学了不少东西,也拿了不少代码,今天决定要回报一下,不管老婆呆会会不会拧我耳朵了。 毫秒定时器,为什么要使用毫秒定时器呢?我想原因有两个。第一:CWnd里面的timer不能精确到毫秒级,所以必须要写一个精确到毫秒级的。第二:用CWnd里面的timer代价太大,因为有时我们的类根本就...
标签: SQLServer
 一个bt主任的要求 值班管理  要求如下 1 一组队列  n 个人, 有4种角色,领导,汉子,大妈,司机。n个人根据自己角色按顺序排好队 2 值班要求:周一到周日 1个领导值班1个司机值班;周一到周日 每晚1个汉子 值班;周六 周日 上午下午2个大妈值班;假期每天1个领导1个司机1个汉子上午下午2个大妈 3 要求队列可增删查该 ,人员...
代码如下: public static void shutdown(){          System.out.print("请输入多少分钟后关机:");          Scanner scanner = new Scanner(System.in);          int minute = scanner.nextInt()*60;  &nb...
标签: 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.也可以使用...
标签: Web开发
  调用方法       img   src="http://...../getImg"           原理,在servlet中随机生成一个4位数字1000-9999       然后把这数字写入session       输出一个图片,上面写有这...

经验教程

428

收藏

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