Play framework是一个web应用程序,大部分的应用逻辑都是通过在Controllers中以响应HTTP请求的方式来完成的。
有时候你可能需要执行一些和HTTP请求无关的应用逻辑。这在处理一些
初始化任务、维护任务、不阻塞HTTP请求连接池的耗时任务时非常有用。
Jobs是完全受Framework管理的。也就是说
play框架会为你管理所有数据库连接事宜、JPA entity manager同步、事物管理。
要创建一个Job,只需要简单地继承play.jobs.Job类就可以。
package jobs;
import play.jobs.*;
public class MyJob extends Job {
public void doJob() {
// execute some application logic here ...
}
}
如果Job需要返回值的话,那么覆盖doJobWithResult()方法即可。
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。
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每隔多久执行一次。
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表达式。
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就会
以非阻塞的方式被立即执行。
public static void encodeVideo(Long videoId) {
new VideoEncoder(videoId).now();
renderText("Encoding started");
}
在job实例上调用now()方法,将会返回一个Promise约定的值。当job完成后,
你可以用Promise来接收job的执行结果。看怎么做的??
应用程序关闭时执行的任务:
可以通过@OnApplicationStop注解来声明在应用程序关闭时要执行的job。
import play.jobs.*;
@OnApplicationStop
public class Bootstrap extends Job {
public void doJob() { Fixture.deleteAll(); }
}
参考:
Asynchronous Jobs
分享到:
相关推荐
在标题"playFramework1.2.3"中,我们关注的是Play Framework的1.2.3版本。这个版本是在其早期发展的一个稳定版本,提供了许多开发者友好的功能。 Play Framework的核心优势在于它采用了模型-视图-控制器(MVC)架构...
- **触发配置**:设置预警产生的时机,包括即时和定时两种方式。 - **消息接收配置**:指定预警信息的接收者,确保消息能准确无误地传达给相关人员。 #### 二、后台任务 后台任务是指在不需要用户直接参与的情况下...
电脑定时关机软件是计算机用户常用的一种工具,主要用于在预设的时间自动关闭计算机,从而实现省电、节能或安排无人值守时的操作。"电脑定时关机 1.2.3绿色注册版"是一款专为此目的设计的应用程序,其特点在于绿色免...
robotframework-ride-1.2.3.win-amd64robotframework-ride-1.2.3.win-amd64robotframework-ride-1.2.3.win-amd64
开发者可以设定定时任务,如周期性执行某项操作,或者在特定时间点触发特定事件。 5. **线程模型(Thread Model)**:JetM提供了多种线程模型以适应不同的应用场景。这些模型包括单线程、多线程以及工作线程池等,...
4. **报警机制**:当任务出现异常或者性能指标超出预设范围时,Console Service能触发报警,通过邮件、短信等方式通知相关人员。 5. **版本控制**:支持任务版本管理,可以回滚到历史版本,便于进行版本对比和问题...
在Python中,`dead_simple_framework-1.2.3-py3-none-any.whl`是一个特定版本的Python库文件,它代表了一个名为`dead_simple_framework`的框架,版本号为1.2.3。这种文件格式被称为wheel文件,是Python的二进制分发...
《XDoclet-Bin-1.2.3:自动化Java文档和代码生成工具》 XDoclet是一款在Java开发领域广泛应用的开源工具,其主要功能是通过解析Java源代码中的特定注解(annotations),自动生成相应的文档、部署描述符(如web.xml...
总之,"jetm-samples-1.2.3.gz"是一个帮助开发者理解和使用JetM框架的重要资源,它包含了具体实现的代码示例,对于深入学习和实践事件管理和定时任务处理有着极大的价值。通过研究这些示例,开发者可以提升自己的...
无论是创建新的工作簿,还是读取和编辑现有文件,NPOI都提供了一套完善的API,使得这些任务变得简单且高效。对于那些在C#项目中需要与Excel打交道的开发者来说,NPOI无疑是一个值得考虑的优秀选择。
【SteamVR 1.2.3 - 全面解析虚拟现实技术的新篇章】 在虚拟现实(VR)领域,SteamVR是不可或缺的一部分,它为开发者和用户提供了一个强大的平台,用于体验和创建各种VR内容。SteamVR 1.2.3版本的发布,标志着这一平台...
Play框架是Scala和Java开发Web应用的一个强大工具,1.2.4版本是它的一个较早发行版。Play框架以其MVC(Model-View-Controller)架构和"开发即运行"的理念著称,使得开发过程更为高效。在这个"play-1.2.4.zip"压缩包...
**jQuery EasyUI 1.2.3 API 深度解析** jQuery EasyUI 是一个基于 jQuery 的前端框架,它提供了一系列轻量级、易于使用的组件,帮助开发者快速构建功能丰富的 Web 应用程序。EasyUI 1.2.3 版本是其历史版本之一,...
《Orabbix 1.2.3:Zabbix监控的得力助手》 Orabbix是一款针对Zabbix监控系统进行扩展和优化的工具,其1.2.3版本在兼容性上迈出了重要的一步,不仅能够与Zabbix 4无缝对接,还能够支持最新的Zabbix 5版本,这为用户...
jquery1.2.3 jquery1.2.3 jquery1.2.3 jquery1.2.3