在做web開發的時候,經常需要在一定的時間去跟新某些東西,或是加載某些東西,這就用到了定時器。
當Web工程啟動時,定時器能自動開始計時,在整個Web工程的生命期裡,定時器每過一段時間就執行一次,是以考慮定時器存放的位置。
定時器肯定不能不能簡單的存在于單個Servlet或JavaBean中,必須能讓定時器宿主的存活期為整個Web工程生命期,在工程啟動時能自動加載運作。結合這兩點,跟 Servlet上下文有關的偵聽器就最合适不過了,通過在工程的配置檔案中加以合理配置,會在工程啟動時自動運作,并在整個工程生命期中處于監聽狀态。
下面就Servlet偵聽器結合Java定時器來講述整個實作過程:
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ContextListener extends HttpServlet implements
ServletContextListener {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(NewsTimerTask.class);
public ContextListener() {
}
private Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new Timer(true);
log.info("定時器已啟動");
timer.schedule(new NewsTimerTask(event.getServletContext()),
TIME_NEWS_DELAY, TIME_NEWS_PERIOD);
log.info("已經添加任務排程表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel(); //定時器的銷毀
log.info("定時器銷毀");
}
}
NewsTimerTask
- 所要安排的任務。 TIME_NEWS_DELAY
- 執行任務前的延遲時間,機關是毫秒。 為0時表明不延遲 TIME_NEWS_PERIOD
- 執行各後續任務之間的時間間隔,機關是毫秒。 NewsTimerTask繼承TimerTask
TimerTask是 由 Timer 安排為一次執行或重複執行的任務。
在這裡我們把ServletContext傳進來,就是為了方面一些存儲的操作。我這裡舉的是調用spring,擷取bean
import java.util.List;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class NewsTimerTask extends TimerTask {
private static final Log log = LogFactory.getLog(NewsTimerTask.class);
private ServletContext context = null;
private NewsinfoDaoImpl newsinfoDao = null;
private static boolean isRunning = false;
public NewsTimerTask(){}
public NewsTimerTask(ServletContext context) {
this.context = context;
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
newsinfoDao = (NewsinfoDaoImpl) wac.getBean("newsinfoDao");
System.out.println("-------------" + newsinfoDao.getById(1).get(0).getContent());
}
@Override
public void run() {
log.info("----------------定時器開始執行-----------------------");
if(!isRunning) {
isRunning = true;
List<Newsinfo> listTopNews = newsinfoDao.queryByBake1(ConstantsConsumer.NEW_TOP_YES);
List<Newsinfo> listTopSystem = newsinfoDao.queryByType(0, ConstantsConsumer.NEWS_SYSTEM);
context.setAttribute("listTopNews", listTopNews);
if(listTopSystem.size() > 0) {
context.setAttribute("newsinfoSystem", listTopSystem.get(0));
}
isRunning = false;
} else {
log.info("上次還在執行中……");
}
log.info("----------------定時器執行結束-----------------------");
}
}
最後在把監聽器部署到web中就可以了
<listener>
<listener-class>ContextListener</listener-class>
</listener>