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、内容は:
5、playを作る.modules.hazelcast.HazelcastPluginクラス:
6、プレイを確立する.modules.hazelcast.HazelCastCacheImplクラス:
7、conf/application.confに構成を追加するには、次の手順に従います.
以上は参考までに、より詳細な情報を入手したい場合は『Play Framework Cookbook』をお読みください.
検索したら、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』をお読みください.