java Timer 定时执行任务

package com.ly.fw.util;



import java.io.Reader;

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;



import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;



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, 17);//小时

      calendar.set(Calendar.MINUTE,45);//分钟

      calendar.set(Calendar.SECOND, 10);//

       

      Date date=calendar.getTime(); //第一次执行定时任务的时间

       

      //如果第一次执行定时任务的时间 小于 当前的时间

      //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。

      if (date.before(new Date())) {

          date = this.addDay(date, 1);

      }

       

      Timer timer = new Timer();

       

      VipDataTimerTask task = new VipDataTimerTask();

      //安排指定的任务在指定的时间开始进行重复的固定延迟执行。

      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();

     }

     

     public static SqlSession getSqlSession(){

         

         SqlSession sqlsession = null;

            try{



      

        //通过Configuration实例生成SqlSessionFactory

          SqlSessionFactory sqlSessionFactory = null;



          //通过xml配置文件方式生成SqlSessionFactory

          String resource = "com/ly/fw/service/Configuration.xml";

          Reader reader = Resources.getResourceAsReader(resource);

          sqlSessionFactory= new SqlSessionFactoryBuilder().build(reader);



          sqlsession = sqlSessionFactory.openSession();

            }catch(Exception e){

                e.printStackTrace();

            }

            

            return sqlsession;

     }

      

}
package com.ly.fw.util;



import java.util.List;

import java.util.TimerTask;







import com.ly.fw.entity.User;

import com.ly.fw.entity.Vip;



import com.ly.fw.service.ScoreLogService;

import com.ly.fw.service.UserService;

import com.ly.fw.service.VipService;



public class VipDataTimerTask extends TimerTask {

     @Override

     public  void run() {

          System.out.println("*****************线程被调用*****************************");

      try {

          //循环所有的会员

            List<User> uList =UserService.vipUserTask();

         

          for (int i = 0; i < uList.size(); i++) {

             

              User u = uList.get(i);

            Vip vip = VipService.vipTask(u.getVipId());

            //赠送会员等级相应的积分

            UserService.scoreChangeTask(vip.getDayScore(),u.getUserId());

            ScoreLogService.addByTask(vip.getDayScore(), u.getUserId());

            

            //写会员积分变化日志

        }

          System.out.println("++++++++++++++++++++执行完成");

      } catch (Exception e) {

          e.printStackTrace();

      }

     }

    }

     

最后的Listener

package com.ly.fw.util;



import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;



public class VipDataTaskListener implements ServletContextListener {

      

         public void contextInitialized(ServletContextEvent event) {

          new TimerManager();

         }

         

         public void contextDestroyed(ServletContextEvent event) {

         }

}

 

 

将监听器集成在web.xml中 系统启动的时候就将任务执行到程序中

<listener>

    <listener-class>com.ly.fw.util.VipDataTaskListener</listener-class>

</listener>

最初偷懒 直接将 new TimerManager() 放到了 首页去执行,结果发现 每次多执行了多次,而且次数越来越多,顿时醒悟调用一次 就添加一次任务到程序中,调用了多次就有多个定时任务执行。以此记录一下

你可能感兴趣的:(timer)