文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:24
字数 739
阅读 91
收藏 1

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
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
810
0
CTNetworking源码拾遗

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

AliThink
2016/09/05
0
0
noteless的博客导航页 所有文章的导航页面

导航 《spring springmvc mybatis maven 项目整合示例系列-导航页》 《JAVA 基础知识点拾遗系列 JAVA学习 -1层 导航页》 《计算机软硬件发展系列个人理解与总结-导航页》...

noteless
06/29
0
0
(新)NODEJS 定时任务管理系统

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

_dedecms
2014/01/17
0
12

没有更多内容

加载失败,请刷新页面

加载更多

storm 环境搭建

1.下载解压 下载地址:http://storm.apache.org/downloads.html

MrPei
26分钟前
1
0
Python Base - 读写文件,字符串拼接,单引号

字符转义 读写文件cvs 字符串拼接,替换 import csvcsv_file_name = 'cardbin.csv'# insert into `card_bin_code` (name_of, code_of, card_no_prefix, bank_code) values ('中国银行......

园领T
27分钟前
1
0
基于JQUERY BOOTSTRAP 最简单的loading遮罩层

<%--loading遮罩层--%><div class="modal fade" id="loadingModal" backdrop="static" keyboard="false">   <div style="width: 200px;height:20px; z-index: 20000; position: abs......

颖辉小居
28分钟前
1
0
springboot+kafka

1,首先springboot对kafka的支持也很好,同样是在配置文件中配置好参数,然后就可以直接使用。先说一下,很简单,,,不要怕 2,我用的依赖是 <dependency> <groupId>org.springframewor...

我真是小菜鸡
32分钟前
3
0
webservice动态客户端自我记录备份(spring boot)

动态客户端相比直接调用webservice的客户端代码要简单很多,但实际上很多工作是java自己替我们做掉了。简单记录一下内容,以备后续使用: pom文件只需要引入: <!-- CXF webservice --><de...

checkboxMan
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部