play framework学习(二) Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务
2013-01-07 12:11
274 查看
转载自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代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
package jobs;
import play.jobs.*;
public class MyJob extends Job {
public void doJob() {
// execute some application logic here ...
}
}
如果Job需要返回值的话,那么覆盖doJobWithResult()方法即可。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
package jobs;
import play.jobs.*;
public class MyJob extends Job<String> {
public String doJobWithResult() {
// execute some application logic here ...
return result;
}
}
这里的String只是一个例子,你可以用任何其他类型。
引导Job(Bootstrap job):
Bootstrap jobs是在play应用程序启动的时候被执行(注意DEV、PROD模式的区别)。通过@OnApplicationStart注解就可以把一个job标记为bootstrap job。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
if(Page.count() == 0) {
new Page("root").save();
Logger.info("The page tree was empty. A root page has been created.");
}
}
}
对于Bootstrap jobs不需要返回值,即使你做了,返回值也会丢失。
默认情况下,所有被@OnApplicationStart注解标记的job按顺序执行完成后,应用程序才开始处理进来的HTTP请求。
如果你想要在应用程序启动时就开始一个job,同时,你想不等这个job执行完就直接开始处理进来的HTTP请求,你可以如下这样通过给注解增加async=true这个参数来达到要求的效果:@OnApplicationStart(async=true)。
所有@OnApplicationStart(async=true)标记的job在应用程序启动时会自动启动,并且所有这些异步job是在同一时刻启动的。
定时任务:
定时任务就是play框架根据用户的设置周期性地执行任务。使用@Every注解来标记job每隔多久执行一次。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
@Every("1h")
public class Bootstrap extends Job {
public void doJob() {
List<User> newUsers = User.find("newAccount = true").fetch();
for(User user : newUsers) {
Notifier.sayWelcome(user);
}
}
}
如果@Every不够用的话,也可以使用更加灵活的@On注解来设置定时任务的时间间隔。@On的设置采用的是CRON表达式。
关于CRON表达式,见/article/2339166.html
一般是把表达式作为一个常量写在程序中,但其实也是可以用配置文件。
比如可以再配置文件中配置cron.myTime=0 22 17 7 4 ? 2013
意思是在2013年4月7日17点22分0秒时干事。
怎么用呢@On("cron.myTime")注意是要加双引号哦,play官网忘了加了。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
/** Fire at 12pm (noon) every day **/
@On("0 0 12 * * ?")
public class Bootstrap extends Job {
public void doJob() {
Logger.info("Maintenance job ...");
...
}
}
在定时任务时,也不需要返回值,即使你做了,返回值也会丢失。
触发task jobs:
在任何时候,你都可以通过调用job实例的now()方法来触发job来执行一个特殊的任务。然后这个job就会以非阻塞的方式被立即执行。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
public static void encodeVideo(Long videoId) {
new VideoEncoder(videoId).now();
renderText("Encoding started");
}
在job实例上调用now()方法,将会返回一个Promise约定的值。当job完成后,你可以用Promise来接收job的执行结果。看怎么做的??
应用程序关闭时执行的任务:
可以通过@OnApplicationStop注解来声明在应用程序关闭时要执行的job。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
@OnApplicationStop
public class Bootstrap extends Job {
public void doJob() { Fixture.deleteAll(); }
}
Play framework是一个web应用程序,大部分的应用逻辑都是通过在Controllers中以响应HTTP请求的方式来完成的。
有时候你可能需要执行一些和HTTP请求无关的应用逻辑。这在处理一些初始化任务、维护任务、不阻塞HTTP请求连接池的耗时任务时非常有用。
Jobs是完全受Framework管理的。也就是说play框架会为你管理所有数据库连接事宜、JPA entity manager同步、事物管理。
要创建一个Job,只需要简单地继承play.jobs.Job类就可以。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
package jobs;
import play.jobs.*;
public class MyJob extends Job {
public void doJob() {
// execute some application logic here ...
}
}
如果Job需要返回值的话,那么覆盖doJobWithResult()方法即可。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
package jobs;
import play.jobs.*;
public class MyJob extends Job<String> {
public String doJobWithResult() {
// execute some application logic here ...
return result;
}
}
这里的String只是一个例子,你可以用任何其他类型。
引导Job(Bootstrap job):
Bootstrap jobs是在play应用程序启动的时候被执行(注意DEV、PROD模式的区别)。通过@OnApplicationStart注解就可以把一个job标记为bootstrap job。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
if(Page.count() == 0) {
new Page("root").save();
Logger.info("The page tree was empty. A root page has been created.");
}
}
}
对于Bootstrap jobs不需要返回值,即使你做了,返回值也会丢失。
默认情况下,所有被@OnApplicationStart注解标记的job按顺序执行完成后,应用程序才开始处理进来的HTTP请求。
如果你想要在应用程序启动时就开始一个job,同时,你想不等这个job执行完就直接开始处理进来的HTTP请求,你可以如下这样通过给注解增加async=true这个参数来达到要求的效果:@OnApplicationStart(async=true)。
所有@OnApplicationStart(async=true)标记的job在应用程序启动时会自动启动,并且所有这些异步job是在同一时刻启动的。
定时任务:
定时任务就是play框架根据用户的设置周期性地执行任务。使用@Every注解来标记job每隔多久执行一次。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
@Every("1h")
public class Bootstrap extends Job {
public void doJob() {
List<User> newUsers = User.find("newAccount = true").fetch();
for(User user : newUsers) {
Notifier.sayWelcome(user);
}
}
}
如果@Every不够用的话,也可以使用更加灵活的@On注解来设置定时任务的时间间隔。@On的设置采用的是CRON表达式。
关于CRON表达式,见/article/2339166.html
一般是把表达式作为一个常量写在程序中,但其实也是可以用配置文件。
比如可以再配置文件中配置cron.myTime=0 22 17 7 4 ? 2013
意思是在2013年4月7日17点22分0秒时干事。
怎么用呢@On("cron.myTime")注意是要加双引号哦,play官网忘了加了。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
/** Fire at 12pm (noon) every day **/
@On("0 0 12 * * ?")
public class Bootstrap extends Job {
public void doJob() {
Logger.info("Maintenance job ...");
...
}
}
在定时任务时,也不需要返回值,即使你做了,返回值也会丢失。
触发task jobs:
在任何时候,你都可以通过调用job实例的now()方法来触发job来执行一个特殊的任务。然后这个job就会以非阻塞的方式被立即执行。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
public static void encodeVideo(Long videoId) {
new VideoEncoder(videoId).now();
renderText("Encoding started");
}
在job实例上调用now()方法,将会返回一个Promise约定的值。当job完成后,你可以用Promise来接收job的执行结果。看怎么做的??
应用程序关闭时执行的任务:
可以通过@OnApplicationStop注解来声明在应用程序关闭时要执行的job。
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/22a2409b5f54b09be114c6328c4e9214.png)
import play.jobs.*;
@OnApplicationStop
public class Bootstrap extends Job {
public void doJob() { Fixture.deleteAll(); }
}
相关文章推荐
- Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务
- Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务
- play framework 2.6 定时任务,异步调度任务的简单使用
- 关于定时器的设计学习记录(学习他人资料)和思考---定时任务 超时控制 频率限制
- 异步任务和网络编程详细学习。四大组件了解下
- 在无密码的账号下设置计划任务,定时关闭和启动数据采集软件,避免软件被关闭或持续运行下内存占用过高
- Spring.Scheduling.Quartz 作业的应用(定时任务和循环触发任务)
- android学习 豆瓣 自定义Progressbar 异步任务加载数据等
- linux 定时任务学习
- Linux(RadHat)基础学习—延时任务和定时任务
- Linux指令学习之crontab 定时执行任务
- spring boot 学习(八)定时任务 @Scheduled
- android学习---异步任务(AsyncTask)
- Pthon的定时任务APScheduler的启动与关闭
- 10w定时任务,如何高效触发超时
- [DAQmx]定时与触发的学习
- WM_CLOSE、WM_DESTROY、WM_QUIT学习总结(点击关闭按钮会触发WM_CLOSE消息,DestroyWindow API会触发WM_DESTROY和WM_NCDESTROY消息,MSDN上写的很清楚)
- java学习—— Timer执行定时任务
- Linux学习之道:Crontab 定时任务 命令详解
- Python模块学习之Timer定时任务,函数自调实现定时获取博客园博客浏览量