zoukankan      html  css  js  c++  java
  • java web每天定时执行任务(四步轻松搞定)

    第一步:

    package com.eh.util;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    
    /**
     * java定时任务,每天定时执行任务
     * @author wls
     *
     */
    public class TimerManager {
    	//时间间隔
    	 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
    	 public TimerManager() {
    		  Calendar calendar = Calendar.getInstance();  
    		        
    		  /*** 定制每日2:00执行方法 ***/ 
    
    		  calendar.set(Calendar.HOUR_OF_DAY, 16);
    		  calendar.set(Calendar.MINUTE, 10);
    		  calendar.set(Calendar.SECOND, 0);
    		  
    		  Date date=calendar.getTime(); //第一次执行定时任务的时间
    		  System.out.println(date);
    		  System.out.println("before 方法比较:"+date.before(new Date()));
    		  //如果第一次执行定时任务的时间 小于 当前的时间
    		  //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。循环执行的周期则以当前时间为准
    		  if (date.before(new Date())) {
    		      date = this.addDay(date, 1);
    		      System.out.println(date);
    		  }
    		  
    		  Timer timer = new Timer();
    		  
    		  NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
    		  //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
    		  timer.schedule(task,date,PERIOD_DAY);
    		 }
    
    		 // 增加或减少天数
    		 public Date addDay(Date date, int num) {
    		  Calendar startDT = Calendar.getInstance();
    		  startDT.setTime(date);
    		  startDT.add(Calendar.DAY_OF_MONTH, num);
    		  return startDT.getTime();
    		 }
    }
    

    第二步:

    package com.eh.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.TimerTask;
    
    /**
     * 在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后
     *发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况
     *发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。
     * @author wls
     *
     */
    public class NFDFlightDataTimerTask extends TimerTask {
    	private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	@Override
    	public void run() {
    		try {
    			 //在这里写你要执行的内容
    			System.out.println("执行当前时间"+formatter.format(Calendar.getInstance().getTime()));
    		} catch (Exception e) {
    			System.out.println("-------------解析信息发生异常--------------");
    		}
    	}
    	
    }
    

    第三步:

    package com.eh.util;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    
    public class NFDFlightDataTaskListener implements  ServletContextListener {
    
    	public void contextInitialized(ServletContextEvent sce) {
    		 new TimerManager();
    	}
    
    	public void contextDestroyed(ServletContextEvent sce) {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    

    第四步:配置web.xml文件

    <!--NFDFlightDataTaskListener 监听器-->
    <listener>
     	<listener-class>com.eh.util.NFDFlightDataTaskListener</listener-class>
    </listener>
    

      

      

  • 相关阅读:
    hiho 1182 : 欧拉路·三
    hiho拓扑排序专题 ——第四十八、四十七周
    hiho欧拉路·二 --------- Fleury算法求欧拉路径
    hdoj1423 最长上升公共子序列
    学习记录--让我打开另一种思路的SQL
    学习记录--如何将exec执行结果放入变量中?
    SQLServer中的Cross Apply、Outer Apply
    学习记录--一列数据转为一个字段
    学习记录--查询没有学全所有课的同学的学号、姓名、以及未学科目
    ISNUMERIC()检测是否为数字
  • 原文地址:https://www.cnblogs.com/LiSheng97625/p/4648739.html
Copyright © 2011-2022 走看看