天天看點

java web中定時器的運用

     在做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>