文档章节

Play框架拾遗之五:其他知识点

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:24
字数 739
阅读 88
收藏 1
点赞 0
评论 0

1、Job异步处理

Job可以有结果返回:

package jobs;
import play.jobs.*;

public class MyJob extends Job<String> {
  public String doJobWithResult() {
    // 执行一些业务逻辑
    return result;
  }
}

Job不仅可以设置启动调用(用@OnApplicationStart),还停止时调用:

import play.jobs.*;

@OnApplicationStop
public class Bootstrap extends Job {
  public void doJob() {
    Fixture.deleteAll();
  }
}

如果希望Web应用启动后,能够在执行Bootstrap Job的同时,又能很快地处理到来的请求,可以为@OnApplicationStart注解添加async=true属性:@OnApplicationStart(async=true)。这样应用程序开启后,Bootstrap Job就会作为后台程序异步执行了。不仅如此,所有的异步Job(async=true)也会在Web应用开启之后同时运行。

@OnApplicationStart(async=true)
public class Bootstrap extends Job {
  public void doJob() {
    if(Page.count() == 0) {
      new Page("root").save();
      Logger.info("A root page has been created.");
    }
  }
}

Play的Job调度是使用Quartz库的CRON表达式,后续会详细介绍

2、HTTP异步编程

Play允许临时挂起HTTP请求。挂起的HTTP请求仍然保持连接,但是该请求的执行会被移出线程池并稍后进行尝试。根据需要,Play可以在一段固定的延时后恢复现场,继续执行请求。

public static void generatePDF(Long reportId) {
  Promise<InputStream> pdf = new ReportAsPDFJob(report).now();
  InputStream pdfStream = await(pdf);
  renderBinary(pdfStream);
}

Play还提供了waitAll() ,waitAny(),waitEither()等方法。

public static void usePromise(){
  F.Promise<WS.HttpResponse> promise1=WS.url("http://domain1.com").getAsync();
  F.Promise<WS.HttpResponse> promise2=WS.url("http://domain2.com").getAsync();
  F.Promise<List<WS.HttpResponse>> promises = F.Promise.waitAll(promise1, promise2);
  await(promises);
  renderText("Execute finished");
}

3、验证码

Play中的play.libs.Images类提供了生成验证码的支持,操作也非常简单。我们可以通过静态方法Images.captacha()快速生成默认大小为150*50的验证码图片,也可以使用Images.captacha(int width, int height)方法生成指定大小的验证码图片。

public static void captcha(){
  Images.Captcha captcha=Images.captcha(); //生成验证码图片
  captcha.addNoise(); //增加澡点
  String code = captcha.getText("#ABCDEF"); //获取文本内容
  captcha.setBackground("#E4EAFD"); //设置背景颜色
  renderBinary(captcha);
}

4、缓存

play.cache.Cache类提供了一系列访问缓存的API,包含了完整的设置、替换和获取数据的方法:

public static void showProduct(String id) {
  Product product = Cache.get(id, Product.class);
  if(product == null) {
    product = Product.findById(id);
    Cache.set("product_"+id, product, "30mn");
  }
  render(product);
}

public static void addProduct(String name, int price) {
  Product product = new Product(name, price);
  product.save();
  showProduct(id);
}

public static void editProduct(String id, String name, int price) {
  Product product = Product.findById(id);
  product.name = name;
  product.price = price;
  Cache.set("product_"+id, product, "30mn");
  showProduct(id);
}

public static void deleteProduct(String id) {
  Product product = Product.findById(id);
  product.delete();
  Cache.delete("product_"+id);
  allProducts();
}

操作缓存的API中有很多方法是以safe作为前缀的,如safeDelete,safeSet等。带safe前缀的方法是阻塞的,而标准方法是非阻塞的,delete方法会立即返回结果,并没有等待缓存对象是否被真正地物理删除。因此,如果程序执行期间发生了错误(例如IO错误),缓存对象可能仍然存在,并没有被删除。如果操作需要确保缓存对象被删除,可以使用safeDelete方法:

Cache.safeDelete("product_"+id);

配置Memcached

memcached=enabled
memcached.host=127.0.0.1:11211

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
Play框架拾遗之三:模板引擎

1、模板语法 用表达式时,如下使用时,只有client不为null的情况下,才进行client.name的输出。 <h1>Client ${client?.name}</h1> 在应用中,模板引擎默认对所有的动态表达式进行转义,以此来...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

CTNetworking源码拾遗

一句话简介:CTNetworking为casa大神针对iOS网络层方案的一个架构实例。 架构详解: 传送门 Github: 传送门 PS: 本拾遗系列文章只专注于代码以及工程层面知识点拾遗,架构层面作者文章已经进行...

AliThink ⋅ 2016/09/05 ⋅ 0

Play源码深入之五:Job模块的原理

先看play.jobs.JobsPlugin。 public void onApplicationStart() { int core = Integer.parseInt(Play.configuration.getProperty("play.jobs.pool", "10")); executor = new ScheduledThread......

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

Play框架拾遗之四:域模型与JPA支持

1、属性模拟 对于model,Play中字段都是public修饰符,但框架会自动生成setter与getter如: @Entity@Table(name="product ")public class Product extends BaseModel{ @Id public Long id; ......

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

(新)NODEJS 定时任务管理系统

此项目地址: https://github.com/robanlee123/RobCron - 题外话 我曾几个月前写过另外一个版本的任务管理系统,链接:http://my.oschina.net/u/568264/blog/120854 至于为什么重写这套系统,原因...

_dedecms ⋅ 2014/01/17 ⋅ 12

知识拾遗 -- 在学《编译原理》

《编译原理》我想很多计算机专业毕业的学生都学过这门课程,说实话,这是一门相当深奥以及苦涩的学科,对我而言,上学的时候完全不知道这玩意是干嘛?更加无法参透它的工作原理以及各种优化的...

边缘行者 ⋅ 2012/08/03 ⋅ 22

Play框架拾遗之二:控制层

1、获取HTTP参数 在Controller控制器,已经内建HTTP请求中参数对象,我们可以这样获取: public static void show(){ String id=params.get("id"); String[] names=params.getAll("name"); L...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

Play框架拾遗之一:HTTP路由

这系列五篇文章,是我在涮www.playframework.cn的读摘,记录了一下重要能用得着,但是又不太熟悉的内容,根据层次划分了五章。 1、路由语法 Play 支持HTTP中规定的GET/POST/PUT/DELETE/HEAD五...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

play 持久层的一些操作

刚学Play,在网上和社区逛了逛大多在说C层和V层,对M层的介绍很少,初学啥都不知道,望大侠们多介绍点关于持久层的入门知识,譬如Play主建策略默认是自增张,但是我想搞个UUID的或者其他的,该...

杨成 ⋅ 2011/06/10 ⋅ 1

Play Framework 的模板引擎

Play 框架有自己的模板引擎来生成HTML页面,该引擎使用 Groovy 做为表达式语言。你可以直接使用 Groovy 语言来创建动态的网页,但并无需学习 Groovy 所有的知识,你需要了解的只是跟 Java 非...

红薯 ⋅ 2010/07/19 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 30分钟前 ⋅ 5

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 35分钟前 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部