上一节我们做完了首页UI界面,但是有个问题:如果我在后台添加了一个商品,那么我必须重启一下服务器才能重新同步后台数据,然后刷新首页才能同步数据。这明显不是我们想要的效果,一般这种网上商城首页肯定不是人为手动同步数据的,那么如何解决呢?我们需要用到线程和定时器来定时自动同步首页数据。
1. Timer和TimerTask
我们需要用到Timer和TimerTask两个类。先来介绍下这两个类。
Timer是一种工具类,在Java.util包中,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。它有个构造函数:
守护线程即主线程结束后,该线程也结束,非守护线程即主线程结束后,该线程仍然继续执行。isDaemon为true时为守护线程。Timer类有个schedule方法可以创建一个任务,如下:
- void schedule(TimerTask task, Date firstTime, long period)
-
-
我们再来看看TimerTask,TimerTask是用来创建一个新的线程任务的,它实现了Runnable接口,如果我们要创建一个新的线程任务,只需要继承TimerTask,并重写run方法即可。
2. 创建一个新的线程任务
下面我们来创建一个新的线程任务,用来更新后台数据:
- @Component
- public class ProductTimerTask extends TimerTask {
-
- @Resource
- private ProductService productService = null;
- @Resource
- private CategoryService categoryService = null;
-
- private ServletContext application = null;
-
- public void setApplication(ServletContext application) {
- this.application = application;
- }
-
- @Override
-
- public void run() {
- System.out.println("----run----");
- List<List<Product>> bigList = new ArrayList<List<Product>>();
-
- for(Category category : categoryService.queryByHot(true)) {
-
- List<Product> lst = productService.querByCategoryId(category.getId());
- bigList.add(lst);
- }
-
- application.setAttribute("bigList", bigList);
- }
-
- }
接下来,我们修改项目启动时监听器里面的内容,原本上面的这个查询操作是放在监听器中,当项目启动时,监听器开始执行,获取后台数据,存到application域中,然后前台通过jstl标签从application域中拿到数据。现在我们把这些事情交给我们定义的ProductTimerTask去做,那么监听器中只要设置一下定时器,让ProductTimerTask定时去更新一下后台数据即可。看看监听器中修改后的代码:
3. 在监听器中启动定时器
-
- public class InitDataListener implements ServletContextListener {
-
- private ProductTimerTask productTimerTask = null;
- private ApplicationContext context = null;
-
- @Override
- public void contextDestroyed(ServletContextEvent event) {
-
-
- }
-
- @Override
- public void contextInitialized(ServletContextEvent event) {
-
- context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
- productTimerTask = (ProductTimerTask) context.getBean("productTimerTask");
-
-
- productTimerTask.setApplication(event.getServletContext());
-
-
- new Timer(true).schedule(productTimerTask, 0, 1000*60*60);
- }
-
- }
关于InitDataListener监听器中原来的操作代码,可以对比上一节中的内容,其实就是ProductTimerTask中的更新后台数据,只不过现在放到TimerTask中去做了而已。这样我们就完成了使用线程和定时器定期同步首页数据,这个时间间隔可以自己设定。
其实CSDN博客里的部分首页数据也不是实时更新的,每天晚上会有个时间更新一次,例如左侧栏目中的博客排名,阅读排行后的显示的阅读量等,这些都是每天晚上更新一次,应该就是在后台设置了每天更新一次,原理跟这里应该是一样的。这样也减轻了服务器的压力。
(注:到最后提供整个项目的源码下载!欢迎大家收藏或关注)
相关阅读:http://blog.csdn.net/column/details/str2hiberspring.html
_____________________________________________________________________________________________________________________________________________________
-----乐于分享,共同进步!
-----更多文章请看:http://blog.csdn.net/eson_15