SSH框架网上商城项目第15战之线程、定时器同步首页数据

所属分类: 软件编程 / java 阅读数: 31
收藏 0 赞 0 分享

上一节我们做完了首页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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Springmvc restful配置遇到的小坑

本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
收藏 0 赞 0 分享

Java中的匿名内部类小结

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的云打印Lodop

这篇文章主要介绍了Java的云打印Lodop 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程池框架核心代码解析

这篇文章主要针对Java线程池框架核心代码进行详细解析,分析Java线程池框架的实现ThreadPoolExecutor,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java 交换两个变量的数值实现方法

下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

全面了解JAVA_BaseDAO数据处理类

下面小编就为大家带来一篇全面了解JAVA_BaseDAO数据处理类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java、python、JavaScript以及jquery循环语句的区别

本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
收藏 0 赞 0 分享

基于JDBC封装的BaseDao(实例代码)

下面小编就为大家带来一篇基于JDBC封装的BaseDao(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

简单通用JDBC辅助类封装(实例)

下面小编就为大家带来一篇简单通用JDBC辅助类封装(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈java线程中生产者与消费者的问题

下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多