基于ServletContextListener以及TimerTask实现Java/WEB的定时任务处理

来源:互联网 发布:php 取数组最大值 编辑:程序博客网 时间:2024/05/29 19:47

简述

在Java/WEB的开发过程中,我们往往需要服务器端的程序能够定时自动为我们处理一点工作,比如定时搜索数据库中的数据, 或者定是向用户发送自动邮件或短信,或者是定时处理session或是application中的过期内容。
在大部分情况下,其实TimerTask已经足够进行这些处理了。但是在某些特定的环境下,例如定时自动处理服务器端application中的数据,那么我们就需要在定是程序中处理ServletContext对象。
但是因为ServletContext是一个标标准准的web对象,在普通的类,比如TimerTask的派生子类中,很难直接操作它,这个时候,我们就需要结合ServletContextListener来进行相关的处理了。

一、编写自动化业务处理类,并继承TimerTask

首先我们需要一个自动化业务处理类,这个类用来处理我们真正想要做的事情:
public class YourTimer extends TimerTask {    private ServletContext servletContext;    public YourTimer(ServletContext servletContext) {super();this.servletContext = servletContext;    }    @Override    public void run() {//在这里撰写业务处理代码    }    }
上述代码片段中的run就是核心的业务处理方法,当我们完成所有的代码,并执行程序的时候,最终这个run方法就会定时为我们解决问题。
注意这个类是继承了TimerTask的,并且它有一个私有属性ServletContext对象,并且在类的构造器中会初始化这个对象。

二、编写监听器类

public class YourListener extends HttpServlet implements ServletContextListener {    public void contextDestroyed(ServletContextEvent arg0) {// TODO Auto-generated method stub    }    /**     * 监听程序开始执行     */    public void contextInitialized(ServletContextEvent arg0) {YourTimer yourTimer = new YourTimer(arg0.getServletContext());/** * 每30秒处理一次 */Timer timer = new Timer();timer.schedule(yourTimer, 0, 30000);    }}
上面的代码片段非常简单,我们自己的这个监听类需要继承HttpServlet,同时实现ServletContextListener接口。
当我们的web容器启动的时候,这个类就会被调用,并且执行contextInitialized这个方法,所以我们只需要在这个方法里直接运行我们的Timer类来进行定时处理就可以了。

三、在web.xml中配置监听器

最后一步,在web.xml文件中配置监听器即可:
<listener>    <listener-class>com.yourpackage.YourListener</listener-class></listener>




原创粉丝点击