利用ServletContextListener 实现定时任务

来源:互联网 发布:淘宝手机版首页模板 编辑:程序博客网 时间:2024/06/06 21:40

一个实现ServletContextListener接口的类: StatisticsContextListener.java
package com.ed.cnc.servletListener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.ed.cnc.city.StatisticsTask;

/** *//**
 * 统计ContextListener
 * @author westd
 *
 */
/** *//**
 * @author westd
 *
 */
public class StatisticsContextListener implements ServletContextListener
{

    private java.util.Timer timer = null;
   
   
    /** *//**
     * 这个方法在Web应用服务做好接受请求的时候被调用。
     *
     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent event)
    {
        timer = new java.util.Timer(true);
        event.getServletContext().log("定时器已启动");
        timer.schedule(new StatisticsTask(event.getServletContext()), 0, 60*60*1000);//每隔1小时
        event.getServletContext().log("已经添加任务调度表");
    }
   
   
    /** *//**
     * 这个方法在Web应用服务被移除,没有能力再接受请求的时候被调用。
     *
     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent event)
    {
        timer.cancel();
        event.getServletContext().log("定时器销毁");
    }

}

 

一个继承于TimerTask的一个类:StatisticsTask.java
package com.ed.cnc.city;

import java.util.Calendar;
import java.util.TimerTask;

import javax.servlet.ServletContext;


/** *//**
 * 统计任务
 * @author westd
 *
 */
public class StatisticsTask extends TimerTask
{

    private static final int STATISTICS_SCHEDULE_HOUR = 0;
    private static boolean isRunning = false;
    private ServletContext context = null;

    public StatisticsTask(ServletContext context)
    {
        this.context = context;
    }
   
    @Override
    public void run()
    {
        Calendar cal = Calendar.getInstance();
        //System.out.println(isRunning);
        if (!isRunning)
        {
            if (STATISTICS_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) //查看是否为凌晨
            {
                isRunning = true;
                context.log("开始执行指定任务");
               
                //TODO 添加自定义的详细任务
                executeTask();
               
                //指定任务执行结束
                isRunning = false;
                context.log("指定任务执行结束");
            }
        }
        else
        {
            context.log("上一次任务执行还未结束");
        }
   
    }

    /** *//**
     * 执行任务
     */
    public void executeTask()
    {
        System.out.println("任务1");
        System.out.println("任务2");
    }
}

 

web.xml中添加如下代码:
<listener>
        <listener-class>com.ed.cnc.servletListener.StatisticsContextListener</listener-class>
</listener>

0 0
原创粉丝点击