• 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>
  • 相关阅读:
    如何使用Oracle的Decode函数进行多值判断
    EXP/IMP 命令参数【转】
    EXISTS 的語法【转】
    Oracle10g SQL tune adviser简单介绍【转自ITPUB zhouwf0726】
    EXPDP/IMPDP 参数中文解释【转】
    oracle 中spfile和pfile简介【转自 henli 】
    Oracle NUMBER类型细讲
    ASP.NET的gridview设置数据格式(DataFormatString="{}")与 String.Format 使用总结 .
    asp.net更改文件夹名称及新建文件夹及删除文件夹
    Decimal转换成¥:123.00格式后再转换成Decimal格式的方法
  • 原文地址:https://www.cnblogs.com/daisyleamo/p/3297843.html
Copyright © 2020-2023  润新知