当前位置: 首页 > news >正文

J2EE项目中后台定时运行的程序

本文转载自:http://blog.csdn.net/huhui_cs/article/details/17003287

在开发J2EE项目中,有时候需要在后台定时执行一些代码。比如定时对web数据建立倒排索引、定时发送邮件、定时写日志文件。下面将这几段代码总结出来,以备以后使用。

    首先需要继承TimerTask类,覆盖run()方法,将需要定时执行的业务代码写在这个run()方法中:

import java.util.Date;  
import java.util.TimerTask;  
  
public class DisplayDate extends TimerTask {  
  
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        try {  
            System.out.println(new Date());//定时打印当前时间  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
    }  
      
}  

然后需要另外一个类实现ServletContextListener 接口,这个接口能够监听web应用的生命周期。当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent事件的两个方法:

 

contextInitialized(ServletContextEvent sce) :当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。

contextDestroyed(ServletContextEvent sce) :当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。

import java.util.Timer;  
  
import javax.servlet.ServletContextEvent;  
import javax.servlet.ServletContextListener;  
  
public class AutoRun implements ServletContextListener {  
      
    private Timer timer = null;  
  
    public void contextInitialized(ServletContextEvent arg0) {  
        // TODO Auto-generated method stub  
        timer=new Timer(true);  
        timer.schedule(new DisplayDate(),0,1000*3);//延迟0秒,每3秒执行一次DisplayDate()  
    }  
      
    public void contextDestroyed(ServletContextEvent arg0) {  
        // TODO Auto-generated method stub  
        timer.cancel();  
    }  
  
}  

 最后就是在web.xml文件中配置,使得该监听器起作用:

<listener>  
     <listener-class>com.hh.autorun.AutoRun</listener-class>  
</listener>

完成以上步骤以后,当你启动服务器软件,如tomcat,后台就会定时运行任务了。

相关文章:

  • shiro介绍
  • Kubernetes对Container Capabilities的支持
  • iOS开发之常用宏定义
  • 佰腾科技的专利大数据的云上裂变之路
  • HTML中常用的几个转义字符
  • 如何让你的产品 性感起来
  • Spring中的事务管理
  • 7行Python代码的人脸识别
  • jvm g1最佳实践及日志查看
  • JS原型链继承
  • 工程之殇
  • 2018第2周日
  • 自我介绍
  • 小程序完整对接 pingpp支付
  • 解决IntelliJ IDEA无法读取配置文件的问题
  • 自己简单写的 事件订阅机制
  • [ JavaScript ] 数据结构与算法 —— 链表
  • FastReport在线报表设计器工作原理
  • gulp 教程
  • JavaScript 基础知识 - 入门篇(一)
  • quasar-framework cnodejs社区
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Twitter赢在开放,三年创造奇迹
  • Vue 重置组件到初始状态
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 解析带emoji和链接的聊天系统消息
  • 你真的知道 == 和 equals 的区别吗?
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何在GitHub上创建个人博客
  • 删除表内多余的重复数据
  • 数据仓库的几种建模方法
  • 微信小程序填坑清单
  • 用Canvas画一棵二叉树
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 我们雇佣了一只大猴子...
  • ​MySQL主从复制一致性检测
  • ​第20课 在Android Native开发中加入新的C++类
  • ![CDATA[ ]] 是什么东东
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (二)JAVA使用POI操作excel
  • (论文阅读40-45)图像描述1
  • (已解决)什么是vue导航守卫
  • (转)linux下的时间函数使用
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 服务 ServiceController
  • .NET和.COM和.CN域名区别
  • .net网站发布-允许更新此预编译站点
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Builder用法
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798