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

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM