jforum——缓存

对岸 发布于 2014/06/16 00:56
阅读 615
收藏 0

1.http://ericxu131.iteye.com/blog/179925

JForum的cache是由net.jforum.cache包下的类来实现的

Cacheable.java 这个接口为Repository实现提供cache引擎
CacheEngine.java JForum的Cache引擎接口
DefaultCacheEngine.java JForum提供的默认cache引擎实现
EhCacheEngine.java EhCache的cache引擎实现
JBossCacheEngine.java JbossCache的cache引擎实现
JBossCacheListener.java Jboss的TreeCacheListener实现

 

net.jforum.repository包下的类都是Cacheable.java接口的实现类,每个repository类通过静态方法提供具体的业务cache方法。

 

net.jforum.JForumBaseServlet.java是JForum中servlet的一个基类,在它的init方法中调用了ConfigLoader.startCacheEngine();方法来初始化所有的Repository。在这个方法中,JForum从SystemGlobals.properties文件中取得Cache引擎的类型,实例化它,之后从这个配置文件中继续取出repository的列表,然后依次实例化每个repository并将Cache引擎注入。

Java代码   收藏代码
  1. public static void startCacheEngine()  
  2. {  
  3.     try {  
  4.         String cacheImplementation = SystemGlobals.getValue(ConfigKeys.CACHE_IMPLEMENTATION);  
  5.         logger.info("Using cache engine: " + cacheImplementation);  
  6.           
  7.         cache = (CacheEngine)Class.forName(cacheImplementation).newInstance();  
  8.         cache.init();  
  9.           
  10.         String s = SystemGlobals.getValue(ConfigKeys.CACHEABLE_OBJECTS);  
  11.         if (s == null || s.trim().equals("")) {  
  12.             logger.warn("Cannot find Cacheable objects to associate the cache engine instance.");  
  13.             return;  
  14.         }  
  15.           
  16.         String[] cacheableObjects = s.split(",");  
  17.         for (int i = 0; i < cacheableObjects.length; i++) {  
  18.             logger.info("Creating an instance of " + cacheableObjects[i]);  
  19.             Object o = Class.forName(cacheableObjects[i].trim()).newInstance();  
  20.               
  21.             if (o instanceof Cacheable) {  
  22.                 ((Cacheable)o).setCacheEngine(cache);  
  23.             }  
  24.             else {  
  25.                 logger.error(cacheableObjects[i] + " is not an instance of net.jforum.cache.Cacheable");  
  26.             }  
  27.         }  
  28.     }  
  29.     catch (Exception e) {  
  30.         throw new CacheEngineStartupException("Error while starting the cache engine", e);  
  31.     }  
  32. }  

net.jforum.ConfigLoader

 

如果要在JForum项目中扩展一个cache功能,只需要实现一个Cacheable.java接口的repository类,并在SystemGlobals.properties中的cacheable.objects参数中配置这个repository就可以了。

Java代码   收藏代码
  1. cacheable.objects = net.jforum.repository.BBCodeRepository, \  
  2.     net.jforum.repository.RankingRepository, \  
  3.     net.jforum.repository.SmiliesRepository, \  
  4.     net.jforum.repository.ForumRepository, \  
  5.     net.jforum.repository.TopicRepository, \  
  6.     net.jforum.SessionFacade, \  
  7.     net.jforum.repository.PostRepository, \  
  8.     net.jforum.repository.Tpl, \  
  9.     net.jforum.repository.RolesRepository, \  
  10.     net.jforum.repository.SecurityRepository, \  
  11.     net.jforum.repository.BanlistRepository  

 SystemGlobals.properties


加载中
0
对岸
对岸

2.http://www.cnblogs.com/fora/archive/2010/04/23/1718781.html

作为一个论坛,应用层缓存这样的东西似乎必不可少,jforum也提供了缓存配置(上面也提到一些)。jforum提供了数种缓存实现(JForumBaseServlet的init流程),分别是DefaultCacheEngine(简单的内存实现),JBossCacheEngine,EhCacheEngine。,请看ConfigLoader的startCacheEngine方法,流程大概就是得到cacheEngine的实现配置(SystemGlobals.properties中配置cache.engine.implementation),然后产生CacheEngine的实例,调用它的init方法进行初始化,然后找到所有的可缓存类(实现了Cacheable接口,并在SystemGlobals.properties中配置cacheable.objects),最后把cacheEngine注入进去获得cache的能力。虽然jforum自己实现了许多这样的注入(除了cacheEngine,还有db,dao等等),虽然达到了一定的的目的,可是怎么说还是到处充满了Singleton的实现(参考spring2.5文档3.9. 粘合代码和可怕的singleton),为了寻求更好的组织方式(例如使用ioc来管理对象,使用成熟的orm来隔离数据库)和获得更多的用户群(选择更广泛使用的框架帮助),大概才会萌发jforum3的想法吧。 

返回顶部
顶部