zoukankan      html  css  js  c++  java
  • web工程定时器

    最近用做的项目不大,但是涉及到的技术挺多,对于我来说也比较新。定时器也是第一次用到,虽然没有用Spring的定时器,不过这个也还不错:

    简单来说创建一个定时任务分为三部分:

    1、时间监听器: 用于监听时间,决定任务的执行周期。利用java.util.Timer执行;

      主要用到了Timer中的两个方法timer.schedule(new yourTask(), 0,1000)——开启任务,timer.cancel()——销毁定时器

          时间监听器需要继承ServletContextListenter,用于监听ServletContext的生命周期(web的生命周期)。详解http://blog.csdn.net/zhaozheng7758/article/details/6103700

      至于HttpServlet,则首先用于接收和读取Http请求,采用HTTP协议,而且一次任务的请求也是一次http请求,因此要继承HttpServlet抽象类。忘记HttpServlet原理的童鞋们可以参阅一下:http://my.oschina.net/wmy1988/blog/75201

    public class TaskListener extends HttpServlet implements ServletContextListener {
        private static final long serialVersionUID = 1L;
        private Timer timer = null;
    
        @Override
        public void contextDestroyed(ServletContextEvent event) {
            timer.cancel();//销毁定时器,这是必须的,每次开启了都要在此次任务执行结束时关闭
            event.getServletContext().log("执行分析定时器销毁");
        }
    
        @Override
        public void contextInitialized(ServletContextEvent event) {
            timer = new Timer(true);
            event.getServletContext().log("执行分析定时器已经启动");
            timer.schedule(new TimeTaskWork(event.getServletContext()), 0,1000); // 0表示tomcat启动的时候运行切不延迟,1000表示运行周期为1秒
            event.getServletContext().log("已经存在任务调度列表");
        }
    }

    2、任务执行:包括定时器在运行的这段期间要做的事情,利用java.util.TimerTask;

      我的定时任务比较复杂,不过过程中也发现了不少问题:

          (1). 我整个项目都是用的注解,因此在写定时器时用@Inject来实例化对象,但是运行时会报taskBarcodeService空指针异常,然后将接口通过new对象来实例化,就没有了此错误。

      (2). 在run()方法中定义的对象如Sample sample = new Sample();  此对象也会报空指针异常,必须将此对象定义为“成员变量”。

    public class TimeTaskWork extends TimerTask {
        @Inject  //注解无效
        private final TaskBarcodeService taskBarcodeService = new TaskBarcodeServiceImpl();private ServletContext context = null;private final Sample sample = new Sample();
    
        public TimeTaskWork(ServletContext context) {
            this.context = context; //实例化时将任务中的日志与监听器中的日志同步
        }
    
        @Override
        public void run() {
            System.out.println("-------------in task----------------");
         ......
    } }

    3、web.xml中配置监听器(一开始没有在web.xml中配置,直接在java程序中调用了,结果每次调用都启用一个定时任务,占用了很大内存空间);

    <listener>
        <listener-class>com.nova.lims.task.TaskListener</listener-class>
    </listener>
  • 相关阅读:
    emWin 界面切换注意事项
    emWin 工程之汉字显示
    emWin 使用 GUIBuilder 放置标题 TEXT 注意
    【转】系统调用和驱动程序中相应函数的参数对应关系
    主机 & 虚拟机 & 开发板 相互通信
    电脑通过网口连接开发板
    【转】ARM交叉编译工具链
    【转】vi 写完文件保存时才发现是 readonly
    【转】ubuntu 12.04下如何开启 NFS 服务 & 设置
    安装完打开 eclipse 提示 JVM 版本较低
  • 原文地址:https://www.cnblogs.com/daisyleamo/p/3297843.html
Copyright © 2011-2022 走看看