定时器-每天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();
        }
    }
}

 

  

  

 

posted @ 2019-05-28 17:33  doraemonlin  阅读(2297)  评论(0编辑  收藏  举报
Live2D
//页脚Html代码