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() 放到了 首页去执行,结果发现 每次多执行了多次,而且次数越来越多,顿时醒悟调用一次 就添加一次任务到程序中,调用了多次就有多个定时任务执行。以此记录一下