play framework学习(二) Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务

转载 2013年01月07日 12:11:20

转载自desert3.http://desert3.iteye.com/blog/1586708



Play framework是一个web应用程序,大部分的应用逻辑都是通过在Controllers中以响应HTTP请求的方式来完成的。


有时候你可能需要执行一些和HTTP请求无关的应用逻辑。这在处理一些初始化任务、维护任务、不阻塞HTTP请求连接池的耗时任务时非常有用。

Jobs是完全受Framework管理的。也就是说play框架会为你管理所有数据库连接事宜、JPA entity manager同步、事物管理

要创建一个Job,只需要简单地继承play.jobs.Job类就可以。
Java代码  收藏代码
  1. package jobs;  
  2.    
  3. import play.jobs.*;  
  4.    
  5. public class MyJob extends Job {  
  6.       
  7.     public void doJob() {  
  8.         // execute some application logic here ...  
  9.     }  
  10.       

}
如果Job需要返回值的话,那么覆盖doJobWithResult()方法即可。
Java代码  收藏代码
  1. package jobs;  
  2.    
  3. import play.jobs.*;  
  4.     
  5. public class MyJob extends Job<String> {  
  6.       
  7.     public String doJobWithResult() {  
  8.         // execute some application logic here ...  
  9.         return result;  
  10.     }  
  11.       
  12. }  

这里的String只是一个例子,你可以用任何其他类型。

引导Job(Bootstrap job):
Bootstrap jobs是在play应用程序启动的时候被执行(注意DEV、PROD模式的区别)。通过@OnApplicationStart注解就可以把一个job标记为bootstrap job。
Java代码  收藏代码
  1. import play.jobs.*;  
  2.    
  3. @OnApplicationStart  
  4. public class Bootstrap extends Job {  
  5.       
  6.     public void doJob() {  
  7.         if(Page.count() == 0) {  
  8.             new Page("root").save();  
  9.             Logger.info("The page tree was empty. A root page has been created.");  
  10.         }  
  11.     }  
  12.       
  13. }  

对于Bootstrap jobs不需要返回值,即使你做了,返回值也会丢失
默认情况下,所有被@OnApplicationStart注解标记的job按顺序执行完成后,应用程序才开始处理进来的HTTP请求
如果你想要在应用程序启动时就开始一个job,同时,你想不等这个job执行完就直接开始处理进来的HTTP请求,你可以如下这样通过给注解增加async=true这个参数来达到要求的效果:@OnApplicationStart(async=true)。
所有@OnApplicationStart(async=true)标记的job在应用程序启动时会自动启动,并且所有这些异步job是在同一时刻启动的

定时任务:
定时任务就是play框架根据用户的设置周期性地执行任务。使用@Every注解来标记job每隔多久执行一次。
Java代码  收藏代码
  1. import play.jobs.*;  
  2.    
  3. @Every("1h")  
  4. public class Bootstrap extends Job {  
  5.       
  6.     public void doJob() {  
  7.         List<User> newUsers = User.find("newAccount = true").fetch();  
  8.         for(User user : newUsers) {  
  9.             Notifier.sayWelcome(user);  
  10.         }  
  11.     }  
  12.       
  13. }  

如果@Every不够用的话,也可以使用更加灵活的@On注解来设置定时任务的时间间隔@On的设置采用的是CRON表达式

关于CRON表达式,见http://blog.csdn.net/suncaishen/article/details/7386032

一般是把表达式作为一个常量写在程序中,但其实也是可以用配置文件。

比如可以再配置文件中配置cron.myTime=0 22 17 7 4 ? 2013

意思是在2013年4月7日17点22分0秒时干事。

怎么用呢@On("cron.myTime")注意是要加双引号哦,play官网忘了加了。

Java代码  收藏代码
  1. import play.jobs.*;  
  2.    
  3. /** Fire at 12pm (noon) every day **/   
  4. @On("0 0 12 * * ?")  
  5. public class Bootstrap extends Job {  
  6.       
  7.     public void doJob() {  
  8.         Logger.info("Maintenance job ...");  
  9.         ...  
  10.     }  
  11.       
  12. }  

定时任务时,也不需要返回值,即使你做了,返回值也会丢失

触发task jobs:
在任何时候,你都可以通过调用job实例的now()方法来触发job来执行一个特殊的任务。然后这个job就会以非阻塞的方式被立即执行
Java代码  收藏代码
  1. public static void encodeVideo(Long videoId) {  
  2.     new VideoEncoder(videoId).now();  
  3.     renderText("Encoding started");  
  4. }  

在job实例上调用now()方法,将会返回一个Promise约定的值。当job完成后,你可以用Promise来接收job的执行结果。看怎么做的??

应用程序关闭时执行的任务:
可以通过@OnApplicationStop注解来声明在应用程序关闭时要执行的job。
Java代码  收藏代码
  1. import play.jobs.*;  
  2. @OnApplicationStop  
  3. public class Bootstrap extends Job {  
  4. public void doJob() { Fixture.deleteAll(); }  
  5. }  

play framework 添加启动任务、定时任务

前人总结了很多东西,真的受益良多,有一个详细的博客在这里,看完立马就明白,我这里只是做一个记录,方便日后查找 http://desert3.iteye.com/blog/1586708 Play ...
  • fhzaitian
  • fhzaitian
  • 2015年07月21日 09:55
  • 3250

Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务

Play framework是一个web应用程序,大部分的应用逻辑都是通过在Controllers中以响应HTTP请求的方式来完成的。 有时候你可能需要执行一些和HTTP请求无关的应用逻辑。这在...
  • maguanghui_2012
  • maguanghui_2012
  • 2017年02月06日 13:16
  • 811

Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务

Play framework是一个web应用程序,大部分的应用逻辑都是通过在Controllers中以响应HTTP请求的方式来完成的。 有时候你可能需要执行一些和HTTP请求无关的应用逻辑。这在...
  • w_j_w2010
  • w_j_w2010
  • 2015年11月18日 14:03
  • 368

play framework 2.5.3 学习和使用过程中的“坑”

play framework 2.5.3 学习和使用过程中的“坑” 最近项目需要,接触到了play, 使用过程中,遇到了一些坑, 记下来。 1. 版本 play 分1.x和 2.x 两个系列,...
  • XuYongshi02
  • XuYongshi02
  • 2016年05月12日 19:20
  • 2208

Java Web 应用开发:Play 框架

本文转载地址:http://blog.sina.com.cn/s/blog_6786db2c01013r0x.html 使用 Play 框架快速开发 Web 应用 简介: 虽然目前有很多种 J...
  • u010624033
  • u010624033
  • 2015年01月05日 23:59
  • 1014

Play framework处理异步结果

什么是异步结果? 到现在为止,我们已经能够将计算结果直接发送到Web客户机了。情况并非总是如此,结果可能取决于结果的计算或长Web服务调用。 因为Play工作的方式,Action代码必须尽可能的...
  • yaomingyang
  • yaomingyang
  • 2017年07月19日 19:32
  • 260

Play Framework 任务计划程序

有些时候,一个Web应用有需要在正常的请求-响应周期之外执行一些代码,比如一些常时间运行的后台任务,或者也是在请求-响应周期中执行,但无需用户交互。 比如我们回到之前的产品分类的例子,我们需要跟踪订单...
  • w_j_w2010
  • w_j_w2010
  • 2015年11月11日 14:43
  • 379

Play framework框架(一)

Play是Java Web敏捷开发的框架 http://www.playframework.com/documentation/1.2.7/home开始项目项目我们将开发一个博客引擎。这不是一个非常...
  • qu358927098
  • qu358927098
  • 2016年04月27日 14:14
  • 1925

Play框架前端应用细节

1、模板语法 用表达式时,如下使用时,只有client不为null的情况下,才进行client.name的输出。 Client ${client?.name} 在应用中,模板引擎默认对所有的动态表...
  • fhzaitian
  • fhzaitian
  • 2016年04月20日 11:56
  • 1099

service的简单使用--后台执行的定时任务

service在安卓中能实现在后台中持久化运行,一个service的典型使用方法,就是在程序第一次运行时启动服务,服务启动后发送一条广播,广播接收器接到广播后再次启动服务,这样就可以保证服务在后台及时...
  • qq_21949639
  • qq_21949639
  • 2016年03月08日 16:42
  • 1153
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:play framework学习(二) Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务
举报原因:
原因补充:

(最多只允许输入30个字)