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
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。