定时器-每天23:00执行一次
2019/7/8 修改:为了获取接口每天的信息,比如获取今天 2019/7/8 00:00:00 的信息,从这个时间点是比较好的,如果直接在24点获取,在24点的时候,其实已经是第二天了,所以作修改为23点。而获取当天时间点也给它固定时分秒为00:00:00.
一、目录:
TimerTaskListencer------定时
SpringContextUtil --------获取bean的工具类(定时器好像不能直接用@Autowired)
AutoMembershipExpire ----想要做什么事的(名字随便)
二、springmvc里配置SpringContextUti、web.xml里配置定时器监听
三、代码:
TimerTaskListencer.java
package 包名; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.util.Calendar; import java.util.Date; import java.util.Timer; /** * 定期器,每天23:00执行一次 */ public class TimerTaskListencer implements ServletContextListener { public Timer timer = null; /** * 初始化定时器,web程序运行的时候加载。 * @param servletContextEvent */ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 1); calendar.set(Calendar.SECOND, 0); //第一次执行定时任务的时间 Date date = calendar.getTime(); //如果第一次执行定时任务的时间小于当前的时间,则在加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。 if (date.before(new Date())) { date = this.addDay(date, 1); } System.out.println("-----开始启动定时器------"); timer = new Timer(true); timer.schedule(new AutoMembershipExpire(),date,1000*60*60*24); //启动后延迟到明天23:00开始执行,每天执行一次。 } /** *销毁定时器 * @param servletContextEvent */ @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { timer.cancel(); } // 增加或减少天数的方法 public Date addDay(Date date, int num) { Calendar startDT = Calendar.getInstance(); startDT.setTime(date); startDT.add(Calendar.DAY_OF_MONTH, num); return startDT.getTime(); } }
SpringContextUtil.java
package 包名; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.Locale; /** * 项目名称: * 类名: SpringContextUtil * 描述: 获取bean的工具类,可用于在线程里面获取bean * 创建人: * 修改备注: * 版本:1.0 */ 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) */ @Override 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()); } }
AutoMembershipExpire.java
package 包名; import 略; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.TimerTask; /** * 定时检测某功能 * */ public class AutoMembershipExpire extends TimerTask { private UserService userService; public AutoMembershipExpire() { } @Override public void run() { //获取bean userService = SpringContextUtil.getBean("userService"); //获取时间(固定为当天开始时间) DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 00:00:00"); String day = formatter.format(new Date()); try { 功能略 } catch (Exception e) { e.printStackTrace(); } } }