`
xianbin
  • 浏览: 212661 次
  • 来自: ...
社区版块
存档分类
最新评论

Play! Framework 框架之自定义缓存

阅读更多
最近在产品研发中希望能引入Membase NoSQL缓存系统,可惜Play!默认支持Memcached,另外可从官网下载Mongo数据库的Module,也能让Play!支持Mongo数据。

在一番搜索之后,发现Play!不支持Membase,这就必须要求我们只能够自己实现Cache。

可惜官网给的编写Module的例子太过简单,昨天发现了《Play Framework Cookbook》这本书,网上有PDF版本,里面介绍了一个实现自我实现Cache的示例,下面给出一个简单的说明,具体详细的实现会在我完成基于Membase的开发后,再详细介绍。

《Play Framework Cookbook》一书中使用的缓存系统是hazelcast。
1、从http://www.hazelcast.com下载hazelcast的zip压缩包;
2、解压后,进入hazelcast的bin目录,执行run.sh(如果是Windows用户,看看有没有run.bat可执行);
3、将hazelcast-XX.jar,hazelcast-client-XX.jar复制到Play的module项目的lib目录中;
4、建立文件:conf/dependencies.yml,内容为:
self: play -> hazelcast 0.1
require:
    - play
    - com.hazelcast -> hazelcast-client 1.9.3.1:
        transitive: false
    - com.hazelcast -> hazelcast 1.9.3.1:
        transitive: false


5、建立play.modules.hazelcast.HazelcastPlugin类:
public class HazelcastPlugin extends PlayPlugin {
  public void onApplicationStart() {
    Boolean isEnabled = new Boolean(Play.configuration.
getProperty("hazelcast.enabled"));
    if (isEnabled) {
     Logger.info("Setting cache to hazelcast implementation");
     Cache.forcedCacheImpl = HazelCastCacheImpl.getInstance();
     Cache.init();
    }
  }
}


6、建立play.modules.hazelcast.HazelCastCacheImpl类:
public class HazelCastCacheImpl implements CacheImpl {
   private HazelcastClient client;
   private static HazelCastCacheImpl instance;
   public static HazelCastCacheImpl getInstance() {
      if (instance == null) {
         instance = new HazelCastCacheImpl();
      }
      return instance;
   }
   private HazelCastCacheImpl() {
      String groupName = Play.configuration.getProperty("hazelcast.
groupname", "dev");
      String groupPass = Play.configuration.getProperty("hazelcast.
grouppass", "dev-pass");
      String[] addresses = Play.configuration.getProperty("hazelcast.
addresses", "127.0.0.1:5701").replaceAll(" ", "").split(",");
      client = HazelcastClient.newHazelcastClient(groupName, 
groupPass, addresses);
   }
   
   private IMap getMap() {
      return client.getMap("default");
   }

   @Override
   public void add(String key, Object value, int expiration) {
      if (!getMap().containsKey(key)) {
         getMap().put(key, value, expiration, TimeUnit.SECONDS);
      }
   }

   @Override
   public boolean safeAdd(String key, Object value, int expiration) {
      getMap().putIfAbsent(key, value, expiration, TimeUnit.SECONDS);
      return getMap().get(key).equals(value);
   }
   @Override
   public void set(String key, Object value, int expiration) {
      getMap().put(key, value, expiration, TimeUnit.SECONDS);
   }
   @Override
   public boolean safeSet(String key, Object value, int expiration) {
      try {
          set(key, value, expiration);
          return true;
      } catch (Exception e) {}
      return false;
   }

   @Override
   public void replace(String key, Object value, int expiration) {
      if (getMap().containsKey(key)) {
         getMap().replace(key, value);
      }
   }
   @Override
   public boolean safeReplace(String key, Object value, int 
expiration) {
      if (getMap().containsKey(key)) {
         getMap().replace(key, value);
         return true;
      }
      return false;
   }

   @Override
   public Object get(String key) {
      return getMap().get(key);
   }
   @Override
   public Map<String, Object> get(String[] keys) {
      Map<String, Object> map = new HashMap(keys.len
      for (String key : keys) {
         map.put(key, getMap().get(key));
      }
      return map;
   }
   @Override
   public long incr(String key, int by) {
      if (getMap().containsKey(key)) {
         getMap().lock(key);
         Object obj = getMap().get(key);
         if (obj instanceof Long) {
            Long number = (Long) obj;
            number += by;
            getMap().put(key, number);
         }
         getMap().unlock(key);
         return (Long) getMap().get(key);
      }
      return 0;
   }
   @Override
   public long decr(String key, int by) {
      return incr(key, -by);
   }

   @Override
   public void clear() {
      getMap().clear();
   }

   @Override
   public void delete(String key) {
      getMap().remove(key);
   }
   @Override
   public boolean safeDelete(String key) {
      if (getMap().containsKey(key)) {
         getMap().remove(key);
         return true;
      }
      return false;
   }
   @Override
   public void stop() {
      client.shutdown();
   }
}


7、在conf/application.conf中添加配置:
hazelcast.enabled=true
hazelcast.groupname=dev
hazelcast.grouppass=dev-pass
hazelcast.addresses=127.0.0.1:5701


以上仅供参考,如果希望获取更详细的内容,可以阅读《Play Framework Cookbook》一书。
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics