Job能够有结果返回:java
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应用开启以后同时运行。promise
@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表达式,后续会详细介绍缓存
Play容许临时挂起HTTP请求。挂起的HTTP请求仍然保持链接,可是该请求的执行会被移出线程池并稍后进行尝试。根据须要,Play能够在一段固定的延时后恢复现场,继续执行请求。dom
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"); }
Play中的play.libs.Images类提供了生成验证码的支持,操做也很是简单。咱们能够经过静态方法Images.captacha()快速生成默认大小为150*50的验证码图片,也可使用Images.captacha(int width, int height)方法生成指定大小的验证码图片。async
public static void captcha(){ Images.Captcha captcha=Images.captcha(); //生成验证码图片 captcha.addNoise(); //增长澡点 String code = captcha.getText("#ABCDEF"); //获取文本内容 captcha.setBackground("#E4EAFD"); //设置背景颜色 renderBinary(captcha); }
play.cache.Cache类提供了一系列访问缓存的API,包含了完整的设置、替换和获取数据的方法:memcached
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);
配置Memcachedurl
memcached=enabled memcached.host=127.0.0.1:11211