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.comhazelcastの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、プレイを確立する.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』をお読みください.