`
ericxu131
  • 浏览: 187374 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JForum源码学习研究3-cache

阅读更多

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

Cacheable.java这个接口为Repository实现提供cache引擎
CacheEngine.javaJForum的Cache引擎接口
DefaultCacheEngine.javaJForum提供的默认cache引擎实现
EhCacheEngine.javaEhCache的cache引擎实现
JBossCacheEngine.javaJbossCache的cache引擎实现
JBossCacheListener.javaJboss的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引擎注入。

	public static void startCacheEngine()
	{
		try {
			String cacheImplementation = SystemGlobals.getValue(ConfigKeys.CACHE_IMPLEMENTATION);
			logger.info("Using cache engine: " + cacheImplementation);
			
			cache = (CacheEngine)Class.forName(cacheImplementation).newInstance();
			cache.init();
			
			String s = SystemGlobals.getValue(ConfigKeys.CACHEABLE_OBJECTS);
			if (s == null || s.trim().equals("")) {
				logger.warn("Cannot find Cacheable objects to associate the cache engine instance.");
				return;
			}
			
			String[] cacheableObjects = s.split(",");
			for (int i = 0; i < cacheableObjects.length; i++) {
				logger.info("Creating an instance of " + cacheableObjects[i]);
				Object o = Class.forName(cacheableObjects[i].trim()).newInstance();
				
				if (o instanceof Cacheable) {
					((Cacheable)o).setCacheEngine(cache);
				}
				else {
					logger.error(cacheableObjects[i] + " is not an instance of net.jforum.cache.Cacheable");
				}
			}
		}
		catch (Exception e) {
			throw new CacheEngineStartupException("Error while starting the cache engine", e);
		}
	}

net.jforum.ConfigLoader

 

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

cacheable.objects = net.jforum.repository.BBCodeRepository, \
	net.jforum.repository.RankingRepository, \
	net.jforum.repository.SmiliesRepository, \
	net.jforum.repository.ForumRepository, \
	net.jforum.repository.TopicRepository, \
	net.jforum.SessionFacade, \
	net.jforum.repository.PostRepository, \
	net.jforum.repository.Tpl, \
	net.jforum.repository.RolesRepository, \
	net.jforum.repository.SecurityRepository, \
	net.jforum.repository.BanlistRepository

 SystemGlobals.properties

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics