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

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
分享到:
评论

相关推荐

    play!framework框架——japid源码

    Framework框架与Japid源码解析** 在软件开发领域,使用高效的框架可以极大地提升开发效率和代码质量。Play! Framework是一个流行的Java Web应用程序框架,它采用模型-视图-控制器(MVC)架构模式,支持敏捷开发,...

    Play Framework Cookbook(PlayFramework )(September 4, 2011)

    - **实现方法**:通过简单的几行代码即可实现自定义缓存策略,例如使用内存缓存、文件缓存等。 #### 三、集成遗留Spring或Guice应用程序 - **知识点概述**:Play Framework 支持与其他Java Web框架(如Spring、...

    Play Framework应用程序框架 v2.7.9-源码.zip

    《Play Framework 应用程序框架 v2.7.9 源码解析》 Play Framework 是一个开源的、基于Java和Scala的Web开发框架,它以其简洁、高性能和模块化的特点,深受开发者喜爱。在本篇文章中,我们将深入探讨Play Framework...

    Play_Framework(手册、配置文档、标签等)

    Play Framework 是一个开源的Web应用框架,用于构建高效、可测试和模块化的Java及Scala应用程序。这个框架以其简洁的API和MVC(Model-View-Controller)架构设计著称,深受开发者的喜爱。以下是关于Play Framework的...

    Play-Utils是一个专门为PlayFramework开发的实用工具包模块

    Play Framework 是一个开源的、基于 MVC(模型-视图-控制器)架构的 Web 应用程序框架,它采用现代开发理念,如响应式编程和Actor模型,提供了高度可测试性和简洁的代码结构。 Play-Utils 模块主要包含以下几个关键...

    Playframework cookbook

    ### Playframework Cookbook 知识点解析 #### 一、Play Framework 概览 - **框架定位**:Play Framework 是一个轻量级、高效的 Java 和 Scala Web 开发框架,旨在简化 Web 应用程序的开发过程。 - **核心特性**: ...

    play-redis:Play框架2缓存插件作为Redis服务器的适配器

    `play-redis` 是一个专门为 Play 框架2设计的缓存插件,它作为一个高效的适配器,使得 Play 应用能够无缝地与 Redis 服务器进行交互,利用 Redis 的高速缓存能力来提升应用性能。在本文中,我们将深入探讨 `play-...

    开发框架.docx

    Play Framework是一个轻量级的Java开发框架,设计用于简化Web应用程序的开发流程,它强调开发效率和可伸缩性。以下是对Play Framework核心特性的详细解释: 1. **动态开发周期**:Play Framework通过自动编译和实时...

    自定义框架下的购物车项目实现

    8. **框架使用**:虽然没有具体指出使用了哪个框架,但在JavaWeb开发中,Spring MVC、Struts2或Play Framework等都是常见的选择。这些框架能简化开发流程,提供模型-视图-控制器(MVC)架构,帮助开发者更好地组织...

    play-cors-filter:玩! 带有 CORS 过滤器的框架 API

    Play Framework是基于Java和Scala的开源Web应用框架,遵循模型-视图-控制器(MVC)架构模式。它提供了强大的功能,如异步I/O、强大的路由系统和丰富的HTTP工具,使得开发高性能Web应用变得简单高效。 `play-cors-...

    基于java的非ssh框架论坛系统

    - 在不使用SSH的情况下,开发者可能会选择轻量级框架,如Spring Boot、Play Framework、Grails或Vaadin等。这些框架具有较低的学习曲线和更快的开发速度。 - 另一种可能的情况是,开发者可能选择了自定义解决方案...

    Struts原理与实践(二).rar

    尽管Struts在早期的Web开发中占据了重要地位,但随着Spring MVC、JSF、Play Framework等其他MVC框架的崛起,Struts的市场份额逐渐被瓜分。这些框架提供了更现代的特性和更好的性能,例如Spring MVC的注解驱动、Play ...

    play-static-asset-optimizations

    使用Play框架优化静态资产加载现代Web应用程序是后端服务,动态网页,自定义静态资产和基于库的静态资产的组合。 为了维持高效的开发过程,最简单的方法是将所有这些内容都放在一个项目中。 但是在生产中,有许多...

    playtutorial

    Play Framework 是一个基于Java和Scala的开源Web应用框架,它以简洁、高效和可测试性为核心,为开发者提供了构建现代Web应用的高效工具。在“playtutorial”这个项目中,我们将深入探讨如何使用Play Framework来创建...

    C# windowsMobile 播放器

    C#作为.NET框架的一部分,提供了丰富的库和工具,使得开发这样的应用程序变得相对简单。 ### 1. 基本概念 **C#**: C#是一种面向对象的编程语言,由微软公司开发,主要用于.NET Framework。它的语法简洁明了,支持...

    StrutsInAction

    不过,随着技术的发展,Struts虽然仍被广泛使用,但已有一些更新的框架如Spring MVC、Play Framework等出现,它们提供了更多现代特性和更好的性能。因此,读者在学习Struts的同时,也应关注其他新兴框架,以便做出最...

    芝麻开门博客网.zip

    1. **Java Web开发框架**:项目可能使用了Spring Boot、Struts2或Play Framework等Java Web框架来构建后端服务。这些框架简化了Web应用的开发,提供了MVC(模型-视图-控制器)架构,便于模块化和代码组织。 2. **...

    自己编写的webFrame,是不是与webwork有点像呢?

    通过分析作者的Web框架,可以对比WebWork或其他知名框架(如Spring MVC、Struts、Play Framework等),理解它们的设计理念和实现差异,这对于提升自己的Web开发技能非常有帮助。同时,分析源码也是深入学习软件工程...

    让Struts 1焕发青春----小议对Struts的改造.

    不过,考虑到Struts 1已经较为老旧,很多现代的Web框架(如Spring Boot、Play Framework等)提供了更强大、更便捷的解决方案,因此在实际项目选择中,也需权衡利弊,适时考虑迁移到更先进的技术栈。

Global site tag (gtag.js) - Google Analytics