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

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

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

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

[b]要创建一个Job[/b],只需要简单地继承play.jobs.Job类就可以。
package jobs;

import play.jobs.*;

public class MyJob extends Job {

public void doJob() {
// execute some application logic here ...
}

}
[b]如果Job需要返回值的话[/b],那么覆盖doJobWithResult()方法即可。
package jobs;

import play.jobs.*;

public class MyJob extends Job<String> {

public String doJobWithResult() {
// execute some application logic here ...
return result;
}

}

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

[b]引导Job(Bootstrap job):[/b]
Bootstrap jobs是在[color=red]play应用程序启动的时候被执行[/color](注意DEV、PROD模式的区别)。通过@OnApplicationStart注解就可以把一个job标记为bootstrap job。
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.");
}
}

}

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

[b]定时任务:[/b]
定时任务就是play框架根据用户的设置周期性地执行任务。使用[color=red]@Every[/color]注解来标记job每隔多久执行一次。
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不够用的话,也可以使用更加灵活的[color=red]@On注解来设置定时任务的时间间隔[/color]。[color=red]@On的设置采用的是CRON表达式[/color]。
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 ...");
...
}

}

在[color=red]定时任务时,也不需要返回值,即使你做了,返回值也会丢失[/color]。

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

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

[b]应用程序关闭时执行的任务:[/b]
可以通过@OnApplicationStop注解来声明在应用程序关闭时要执行的job。
import play.jobs.*;
@OnApplicationStop
public class Bootstrap extends Job {
public void doJob() { Fixture.deleteAll(); }
}

参考:[url=http://www.playframework.org/documentation/1.2.3/jobs]Asynchronous Jobs[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值