admin 发表于 2014-6-4 21:20

java定时任务每天执行TimerTask 使用方法

ReportTask:
/**
* Copyright (c) 2010-2013 by科帮网
* All rights reserved.
*/
package com.Task;

import java.util.TimerTask;

import javax.servlet.ServletContext;

import org.springframework.web.context.ContextLoader;

import com.acts.resultProcessing.analysis.AnalysisManage;

/**
*@Function: 定时任务
*@Class Name: ReportTask
*@Author: 科帮网
*@Date: 2014-6-4
*@Modifications:
*@Modifier Name; Date; The Reason for Modifying
*
*/
public class ReportTask extends TimerTask {

      
      /**
         *@Function: 任务执行
         *@Author: 科帮网
         *@Date: 2014-6-4
         *@Modifications:
         *@Modifier Name; Date; The Reason for Modifying
         *
         */
      @Override
      public void run() {
            //任务执行方法
      }
      
      
}

TaskTimerManage:
/**
* Copyright (c) 2010-2012 by科帮网
* All rights reserved.
*/
package com.Task;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

/**
* TODO
* @author 科帮网
* @date 2014-6-4
*/
public class TaskTimerManage {
      // 时间间隔
      private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;

      private Timer timer = null;
      
      /**
         *
         *@Function: 启动定时器
         *@Author:科帮网
         *@Date: 2014-6-4
         *@Modifications:
         *@Modifier Name; Date; The Reason for Modifying
         *
         */
      public void start(){
                Calendar calendar = Calendar.getInstance();
                /*** 定制每天凌晨2:00执行方法 ***/
                calendar.set(Calendar.HOUR_OF_DAY, 2);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.SECOND, 0);
                Date date = calendar.getTime(); // 第一次执行定时任务的时间
                // 如果第一次执行定时任务的时间 小于 当前的时间
                // 此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
                if (date.before(new Date())) {
                        date = this.addDay(date, 1);
                }
                timer = new Timer(true);
                ReportTask reportTask = new ReportTask();
                timer.schedule(reportTask, date, PERIOD_DAY);
      }
      
      /**
         *
         *@Function: 停止定时器
         *@Author:科帮网
         *@Date: 2014-6-4
         *@Modifications:
         *@Modifier Name; Date; The Reason for Modifying
         *
         */
      public void stop(){
                if(timer!=null){
                        timer.cancel();
                }
      }
      /**
         *
         *@Function: 增加或减少天数
         *@Author:科帮网
         *@param date
         *@param num
         *@returnDate
         *@Date: 2014-6-4
         *@Modifications:
         *@Modifier Name; Date; The Reason for Modifying
         *
         */
      public Date addDay(Date date, int num) {
                Calendar startDT = Calendar.getInstance();
                startDT.setTime(date);
                startDT.add(Calendar.DAY_OF_MONTH, num);
                return startDT.getTime();
      }

}

在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后
发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况
发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。
StartUpListener:
/**
* Copyright (c) 2010-2013 by科帮网
* All rights reserved.
*/
package com.Task;

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

/**
*@Function: 监听
*@Class Name: StartUpListener
*@Author: 科帮网
*@Date: 2014-6-4
*@Modifications:
*@Modifier Name; Date; The Reason for Modifying
*
*/
public class StartUpListener implements ServletContextListener {

      private TaskTimerManage taskTimerManage = null;
      /**
         *@Function: 销毁
         *@param arg0
         *@Author: 科帮网
         *@Date: 2014-6-4
         *@Modifications:
         *@Modifier Name; Date; The Reason for Modifying
         *
         */
      @Override
      public void contextDestroyed(ServletContextEvent event) {
                if(taskTimerManage!=null){
                        taskTimerManage.stop();
                }
      }

      /**
         *@Function: 初始化
         *@param arg0
         *@Author: 科帮网
         *@Date: 2014-6-4
         *@Modifications:
         *@Modifier Name; Date; The Reason for Modifying
         *
         */
      @Override
      public void contextInitialized(ServletContextEvent event) {
                taskTimerManage = new TaskTimerManage();
                taskTimerManage.start();
      }


}

web.xml配置:
      <listener>
   <listener-class>
       com.Task.StartUpListener
    </lstener-class>
      </lstener>


页: [1]
查看完整版本: java定时任务每天执行TimerTask 使用方法