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代码- 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);
- }
- }
如果要在JForum项目中扩展一个cache功能,只需要实现一个Cacheable.java接口的repository类,并在SystemGlobals.properties中的cacheable.objects参数中配置这个repository就可以了。
Java代码- 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