最近在做一个小程序,其中要实现一个每天晚上十二点对用户的某个状态进行修改的操作,在网上查找了一些资料最终实现具体原理并不是十分明白但最终实现,下面是我实现的一些步骤:
1.定时间间隔,应该就是设定方法执行的时间。
/** * 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, 0); calendar.set(Calendar.MINUTE, 0); 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(); StateZeroController task = new StateZeroController(); //安排指定的任务在指定的时间开始进行重复的固定延迟执行。 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(); } }
2.定义一个监听器,其中在contextInitialized方法中new 之前设定的执行时间的对象
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 } }3.在web.xml中配置定时器
<!--NFDFlightDataTaskListener 监听器--> <listener> <listener-class>com.miaoying.util.NFDFlightDataTaskListener</listener-class> </listener>4.由于继承了TimerTask,在类中无法实现自动装配new对象,我在网上找了这么一个工具类
public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext context = null; /* (non Javadoc) * @Title: setApplicationContext * @Description: spring获取bean工具类 * @param applicationContext * @throws BeansException * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } public static <T> T getBean(String beanName){ return (T) context.getBean(beanName); } public static String getMessage(String key){ return context.getMessage(key, null, Locale.getDefault()); } }5.我在controller中开始使用我要执行的方法
public class StateZeroController extends TimerTask { private UserServcie userServcie;//之前的写法是用@Autowired注入 但是spring无法注入子线程 private Map<String, Object> map;// controler接受的参数放在map中 调用定时任务的时候 参数需要传过来 所以 要有无参,含参构造 public StateZeroController(Map<String, Object> map) { super(); this.map = map; } public StateZeroController() { super(); //自己需要含参构造且注入service userServcie = SpringContextUtil.getBean("userServiceImpl"); } private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 将签到状态和明日参加状态和昨天赚取的金额归零 */ public void run() { try { //在这里写你要执行的内容 userServcie.serStateZero(); System.out.println("执行当前时间"+formatter.format(Calendar.getInstance().getTime())); } catch (Exception e) { System.out.println("-------------解析信息发生异常--------------"); } } }
感谢其他博主提供的资料,也希望我的资料对你有一些帮助