程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SSH框架網上商城項目第15戰之線程、准時器同步首頁數據

SSH框架網上商城項目第15戰之線程、准時器同步首頁數據

編輯:關於JAVA

SSH框架網上商城項目第15戰之線程、准時器同步首頁數據。本站提示廣大學習愛好者:(SSH框架網上商城項目第15戰之線程、准時器同步首頁數據)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第15戰之線程、准時器同步首頁數據正文


上一節我們做完了首頁UI界面,然則有個成績:假如我在後台添加了一個商品,那末我必需重啟一下辦事器能力從新同步後台數據,然後刷新首頁能力同步數據。這顯著不是我們想要的後果,普通這類網上商城首頁確定不是工資手動同步數據的,那末若何處理呢?我們須要用到線程和准時器來准時主動同步首頁數據。
1. Timer和TimerTask
我們須要用到Timer和TimerTask兩個類。先來引見下這兩個類。
Timer是一種對象類,在java.util包中,線程用其支配今後在後台線程中履行的義務。可支配義務履行一次,或許按期反復履行。它有個結構函數:

Timer(boolean isDaemon) 
//創立一個新計時器,可以指定其相干的線程作為守護法式運轉。 

守護線程即主線程停止後,該線程也停止,非守護線程即主線程停止後,該線程依然持續履行。isDaemon為true時為守護線程。Timer類有個schedule辦法可以創立一個義務,以下:

void schedule(TimerTask task, Date firstTime, long period)  
//支配指定的義務在指定的時光開端停止反復的固定延遲履行。 
//第一個參數是指定義務,即TimerTask對象;第二個參數為第一次開啟義務時光;

第三個參數為時光距離,即每隔多長時光履行一次 

我們再來看看TimerTask,TimerTask是用來創立一個新的線程義務的,它完成了Runnable接口,假如我們要創立一個新的線程義務,只須要繼續TimerTask,偏重寫run辦法便可。

2. 創立一個新的線程義務
上面我們來創立一個新的線程義務,用來更新後台數據:

@Component //把該對象交給Spring治理 
public class ProductTimerTask extends TimerTask { 
   
  @Resource 
  private ProductService productService = null; //注入productService 
  @Resource 
  private CategoryService categoryService = null; //注入categoryService 
   
  private ServletContext application = null; //界說一個ServletContext對象,由於我們更新了後台數據後,須要存入application域外面 
   
  public void setApplication(ServletContext application) { 
    this.application = application; //經由過程監聽器將這個application對象set出去,由於這裡是沒法拿application對象的 
  } 
   
  @Override 
   //和監聽器在項目啟動的時刻數據初始化的邏輯一樣 
  public void run() { 
    System.out.println("----run----"); 
    List<List<Product>> bigList = new ArrayList<List<Product>>(); //bigList中寄存一個裝有Category類的list 
     // 1. 查詢出熱門種別 
    for(Category category : categoryService.queryByHot(true)) { 
      //依據熱門種別id獲得推舉商品信息 
      List<Product> lst = productService.querByCategoryId(category.getId()); 
      bigList.add(lst); //將裝有category的list放到bigList中 
    } 
     // 2. 把查詢的bigList交給application內置對象 
     application.setAttribute("bigList", bigList); //假定我們曾經拿到了application對象 
  } 
 
} 

接上去,我們修正項目啟動時監聽器外面的內容,本來下面的這個查詢操作是放在監聽器中,當項目啟動時,監聽器開端履行,獲得後台數據,存到application域中,然後前台經由過程jstl標簽從application域中拿到數據。如今我們把這些工作交給我們界說的ProductTimerTask去做,那末監聽器中只需設置一下准時器,讓ProductTimerTask准時去更新一下後台數據便可。看看監聽器中修正後的代碼:

3. 在監聽器中啟動准時器

//@Component //監聽器是web層的組件,它是tomcat實例化的,不是Spring實例化的。不克不及放到Spring中 
public class InitDataListener implements ServletContextListener { 
   
  private ProductTimerTask productTimerTask = null; //界說一個ProductTimerTask對象 
  private ApplicationContext context = null; 
   
  @Override 
  public void contextDestroyed(ServletContextEvent event) { 
    // TODO Auto-generated method stub 
 
  } 
 
  @Override 
  public void contextInitialized(ServletContextEvent event) { 
 
    context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());         
    productTimerTask = (ProductTimerTask) context.getBean("productTimerTask");//從設置裝備擺設文件中獲得ProductTimerTask對象 
 
    //把內置對象交給productTimerTask,由於productTimerTask外面是拿不到application的,只能經由過程監聽器set給它 
    productTimerTask.setApplication(event.getServletContext()); 
 
    //經由過程設置准時器,讓首頁的數據每一個一小時同步一次(設置裝備擺設為守護線程) 
    new Timer(true).schedule(productTimerTask, 0, 1000*60*60);//每一個一小時履行一次productTimerTask義務,即更新一下後台數據 
  } 
 
} 

 關於InitDataListener監聽器華夏來的操作代碼,可以比較上一節中的內容,其實就是ProductTimerTask中的更新後台數據,只不外如今放到TimerTask中去做了罷了。如許我們就完成了應用線程和准時器按期同步首頁數據,這個時光距離可以本身設定。
其實CSDN博客裡的部門首頁數據也不是及時更新的,天天早晨會有個時光更新一次,例如左邊欄目中的博客排名,浏覽排行後的顯示的浏覽量等,這些都是天天早晨更新一次,應當就是在後台設置了天天更新一次,道理跟這裡應當是一樣的。如許也加重了辦事器的壓力。

本文鏈接:http://blog.csdn.net/eson_15/article/details/51387378

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved