在web端写定时任务的方式

1、创建一个监听 实现 ServletContextListener类

public class TimeTaskListener implements ServletContextListener{
private DayReportATask dayReportATask = new DayReportATask();  
 
   /** 
    * 本方法的描述: 
    * 在所有的filter和servlet都destroyed后通知web应用的所有的ServletContextListeners[that“本店”即将打烊啦] 
    */  
   public void contextDestroyed(ServletContextEvent sce) {  
       System.out.println("contextDestroyed…………");  
       dayReportATask.taskEnd();  
   }  
 
   /** 
    * 这个方法的描述: 
    * 在所有的filter和servlet初始化之前,所有的ServletContextListeners会收到[您所在的web应用的初始化工作开始啦]通知 
    */  
   public void contextInitialized(ServletContextEvent arg0) {  
       System.out.println("contextInitialized……");  
       dayReportATask.taskBegin();  
   }  
}

2、创建一个类执行定时任务 此处使用的是在特点时间点进行定时任务的启动,并周期为1天

public class DayReportATask {
// newScheduledThreadPool(int corePoolSize),corePoolSize是线程池的大小,  
    //即保持活动或者闲置的线程,它们是任务调度时用于并发执行的线程  
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);  
    ScheduledFuture<?> taskHandle;  
    
    /** 
     * 启动任务 
     */  
    public void taskBegin() {  
        // 定义一个任务  
        final Runnable task = new Runnable() {  
            public void run() {  
                System.out.println("执行任务");  
            }  
        };  
  
        // scheduleAtFixedRate(Runnable command, long initialDelay, long period,  
        // TimeUnit unit):  
        // 通过ScheduledExecutorService的scheduleAtFixedRate来执行任务  
        // 参数  
        // command - 要执行的任务  
        // initialDelay - 首次执行的延迟时间  
        // period - 连续执行之间的周期  
        // unit - initialDelay 和 period 参数的时间单位  
        System.out.println("任务启动………………………………");  
        long oneDay = 24 * 60 * 60 * 1000;  
        long initDelay  = getTimeMillis("03:00:00") - System.currentTimeMillis();  
        initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;  
        taskHandle = scheduler.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);  
//        taskHandle = scheduler.scheduleAtFixedRate(task, initDelay, oneDay, TimeUnit.MILLISECONDS);  
    }  
  
    /** 
     * 结束任务 
     */  
    public void taskEnd() {  
        scheduler.shutdown();   //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。  
//      List<Runnable> shutdownNow()试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。   
    }  
    
    /** 
     * 获取指定时间对应的毫秒数 
     * @param time "HH:mm:ss" 
     * @return 
     */  
    private static long getTimeMillis(String time) {  
        try {  
            DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");  
            DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");  
            Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);  
            return curDate.getTime();  
        } catch (ParseException e) {  
            e.printStackTrace();  
        }  
        return 0;  
    }  
}

3、在web.xml中配置监听

  <listener>  
    <listener-class>listeners.TimeTaskListener</listener-class>  
  </listener>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值