Play Framework Web开发教程(19): 任务–启动一些进程

PlayStation:游戏物理引擎与PlayStation性能优化_2024-07-19_18-38-27.Tex 在深入探讨游戏物理引擎与PlayStation性能优化之前,了解PlayStation 5(PS5)的硬件架构是至关重要的。PS5采用了AMD定制的Zen 2架构CPU和RDNA 2架构GPU,这为游戏开发者提供了强大的计算和图形处理能力。此外,PS5还配备了高速SSD,极大地减少了游戏加载时间,提升了游戏体验。在《最后生还者》(The Last of Us)这款游戏中,物理引擎的优化是提升游戏体验和性能的关键。游戏中的环境互动、角色动作以及物体的物理反应都需要高度精确和流畅的物理模拟。 阅读详情

有些时候,一个Web应用有需要在正常的请求-响应周期之外执行一些代码,比如一些常时间运行的后台任务,或者也是在请求-响应周期中执行,但无需用户交互。
比如我们回到之前的产品分类的例子,我们需要跟踪订单是否有人拣选,打包了和发货了。拣选货物涉及了某个人根据订单在仓库中查找订单中的物品,然后可以打包这些货品,交给物流发货。一个实现方法是生成新图所示的货品目录的物品拣选单(和HTML表单无关)。
20140817001

在过去很长的一段时间内,系统构架都假定这些任务都在Web应用外实现,比如在一些旧系统中的批量任务生成。 而今天的系统很多是为Web为中心的,或者是基本云服务的。使用这些架构意味着我们需要在Web应用中有能够调度和执行这些任务。
为了更好的说明问题,我们考虑这样一个系统,这个系统用来生成物品拣选单并把拣选单发给仓库管理员,我们假定我们需要使用批量处理,因为生成一个拣选任务比较费时,而且我们需要优化这些任务的顺序以使得访问不同仓库的时间最小。

异步工作的任务
一个最简单的实现方法是在Web应用的某个地方定义如下的页面:
20140817002
用户点击”Generate & Send Pick List”按钮触发这个任务。

拣选单中的每个项目都是一个从指定仓库中提取物品的准备单,我们可以使用如下View模板来显示这个拣选单,
文件app/views/pickList.scala.html

1@(warehouse: String, list: List[models.Preparation],
2        time: java.util.Date)
3 
4@main("Warehouse " + warehouse + " pick list for " + time){
5    <table>
6        <tr>
7            <th>Order #</th>
8            <th>Product EAN</th>
9            <th>Product description</th>
10            <th>Quantity</th>
11            <th>Location</th>
12        </tr>
13        @for((preparation,index) <- list.zipWithIndex){
14            <tr@(if (index %2 ==0 " class = 'odd'") >
15                <th>@preparation.orderNumber</th>
16                <th>@preparation.product.ean</th>
17                <th>@preparation.product.description</th>
18                <th>@preparation.quantity</th>
19                <th>@preparation.location</th>
20        </tr> }
21    </table>
22}

通常显现这个View模板的情况是在一个Controller的某个Action中显示这个页面,比如,你可能会在浏览器中预览这个PickList:
文件:app/controllers/PickLists.scala

1object PickLists extends Controller{
2  def preview (warehouse:String) = Action {
3    val pickList = PickList.find (warehouse)
4    val timestamp = new java.util.Date
5    Ok (views.html.pickList(warehouse,pickList,timestamp))
6 
7  }
8}

然而,我们希望在另外的进程中生成,显示和发送PickList,从而使得这个过程和Controller中给浏览器发送响应消息的工作独立开来。
我们首先可以使用Scala的futures 来异步执行一些代码
文件app/controllers/PickLists.scala

1package controllers
2 
3import models.PickList
4import play.api.mvc.{Action, Controller}
5 
6import scala.concurrent.{ExecutionContext,future}
7 
8object PickLists extends Controller{
9 ...
10 
11  def sendAsync (warehouse:String) = Action {
12    import ExecutionContext.Implicits.global
13    future {
14      val pickList = PickList.find (warehouse)
15      send(views.html.pickList(warehouse,pickList,new java.util.Date))
16    }
17    Redirect(routes.PickLists.index())
18 
19  }
20}

这里我们使用了scala.concurrent.future来封装了一些异步执行的代码,这意味着不管send执行需要多久的时间,这个Action会立马执行网页的重定向到routes.PickLists.index。这时send发生在另外的一个execution context中。

任务调度
根据我们仓库如何工作的不同,可能自动每隔半小时自动生成pick list更为有效。为了实现这个功能,我们需要每隔半小时触发这个任务而无需人工干预。Play没有直接支持任务调度,但Play集成了Akka(参见Akka教程),因此我们可以使用Akka来周期调度这个任务,我们无需用户界面,而是在Play应用开始时创建和调度一个actor.
文件:app/Global.scala

1import play.api.GlobalSettings
2import akka.actor.{Actor,Props}
3import models.Warehouse
4import play.api.libs.concurrent.Akka
5import play.api.templates.Html
6import play.api.libs.concurrent.Execution.Implicits.defaultContext
7 
8object Global extends GlobalSettings{
9  override def onStart(application:play.api.Application) {
10    import scala.concurrent.duration._
11    import play.api.Play.current
12 
13    for(warehouse <- Warehouse.find()){
14      val actor = Akka.system.actorOf(
15        Props(new PickListActor(warehouse))
16      )
17 
18      Akka.system.scheduler.schedule(0.seconds,30.minutes,actor,"send")
19    }
20  }
21}

这段代码中应用启动时为每个仓库创建一个Actor,然后我们利用Akka的调度器 API 创建一个每半小时执行的任务。下面为PickListActor 一个可能的实现:

1class PickListActor(warehouse: String) extends Actor {
2  def receive = {
3    case "send" => {
4      val pickList = PickList.find(warehouse)
5      val html = views.html.pickList(warehouse, pickList, new Date)
6      send(html)
7    }
8    case _ => play.api.Logger.warn("unsupported message type")
9  }
10  def send(html: Html) {
11    // ...
12  }
13}

其中send的具体实现无关紧要,重点是我们可以利用Akka函数库构建一个定时执行的任务。

异步返回结果和暂停的请求
之前我们介绍了在另外一个线程中执行一个较长运行的任务,那是一个不需要返回结果的情况,但有时我们需要异步返回的结果。
比如,我们需要显示一个仪表盘来显示当前订单量的数目–也就是给定仓库的需要拣选和发货的订单数,这意味着检查所有订单并返回订单数目。
比如,我们使用如下一个函数返回所有的订单:

1val backlog = models.Order.backlog(warehouse)

假定这个函数执行的时间比较长。我们使用一个异步操作来获取订单,暂停HTTP请求,在等待结果的同时可以处理其它请求,下面是一个可能的实现:
文件:pp/controllers/Dashboard.scala

1package controllers
2import play.api.mvc.{Action, Controller}
3import concurrent.{ExecutionContext, Future}
4object Dashboard extends Controller {
5  def backlog(warehouse: String) = Action {
6    import ExecutionContext.Implicits.global
7    val backlog = scala.concurrent.future {
8      models.Order.backlog(warehouse)
9    }
10    Async {
11      backlog.map(value => Ok(value))
12    }
13  }
14}

这里scala.concurrent.future 返回一个promise 来封装一个尚未有结果的对象,它的类型为Future[String],代表一个String类型的占位符。
关于Future它代表一个可能还没有结束的结束过程,我们在后面这详细介绍,而且本篇的例子不是个完整的例子,这里只需要了解Web编程中异步操作的基本概念就可以了。

任务管理系统(基于play框架) 任务管理系统需要个人注册,然后才能管理自己的任务 立即下载

相关推荐

akka-quartz-scheduler:Quartz扩展和实用程序,用于Akka中的cron式调度

阿卡石英计 Quartz扩展和实用程序,可在Akka 2.6.x中进行真正的调度。 当前版本是针对Scala 2.13.x和Akka 2.6.x构建的,可在Maven Central上使用。 如果您想支持Scala和Akka的其他组合,只需将您的请求发布在问题页面上(以及为什么当前可用的版本对您不起作用的原因。我一直对这些事情感到好奇)。 为什么选择Akka和Quartz? 请注意,由于以下原因,它被命名为akka-quartz-scheduler并被定位为目标:它不是Quartz的完整端口。 相反,我们利用Quartz的调度系统的概念为Akka提供了比现有的调度组件更健壮和可靠的调度组件。 这里的目标是为Akka提供一个调度系统,该调度系统与人们对Cron型作业的期望更加接近-设置可以长时间运行的ActorSystem,这些事件可以由Quartz启动。 目前尚无任何计划与分布式

ansible的play任务

ansible的play任务就是在控制节点上,对多个节点进行计划任务部署。通过调用模块来执行相关操作 [class@lxb test2]$ cat lianxi.yml --- - name: first #play任务1:first hosts: firest #针对的主机 # become: yes #是否对受控节点采用变身(更改为root权限) tasks: #task,分任务 - n...

qq_44685426的博客 919

play开发手册,数据库开发,配置,单元测试,定时任务等相关文档

play开发手册,数据库开发,配置,单元测试,定时任务等相关文档

ansible 常见指令表

Play 指令说明 accelerate 开启加速模式 accelerate_ipv6 是否开启ipv6 accelerate_port 加速模式的端口 always_run any_errors_fatal 有任务错误时,立即停止 become 是否提权 become_flags...

277

akka 定时任务实例for play2.1

有时需要设定将来发生的事情,这时该怎么办?ActorSystem搞定一切!     在那儿你能找到scheduler方法,它返回一个 akka.actor.Scheduler 实例, 这个实例在每个Actor系统里是唯一的,用来指定一段时间后发生的行为。     请注意定时任务是使用ActorSystem的MessageDispatcher执行的.     你可以计划向actor发送消息

w_j_w2010的博客 3429

Play Framework Web开发教程 19 任务启动一些进程

Play Framework Web开发教程 19 任务启动一些进程

qq_43685118的博客 311

Web开发框架第2部分:Play Framework 2.0

作为 评估系列 的第一个候选人, 我们回顾了 Play Framework v2.0 。 可以从Play 文档站点获得本文所使用的教程和参考文档。 本文的第一部分将介绍我们建议对每个框架执行的一组任务,然后继续评估每个标准项。 在开发工作站中安装框架 非常简单,分三个步骤: 下载ZIP发行版 解压缩 将解压缩的文件夹添加到您的PATH中 而且很好! 使用...

最佳 Java 编程 443

Play Framework Web开发教程(16): 处理HTTP请求和响应

设计应用的一个方面是规划HTTP请求的URL规范,超链接,HTTP表单以及可能的公用API接口。在Play这是通过路由配置,然后在控制器中实现相应的接口。Play应用中的路由配置可以Controller类构成了MVC框架中的控制层,如下图所示:在Play应用中Controller为定义了HTTP接口的Scala类,而你的路由配置决定了给定的HTTP请求调用哪个Controller中定义的方法,这些

引路蜂移动软件 1万+

Play! framework开发规范

适用于Play! framework 1.2.4版Play! Framework简介Play! framework并不是一套spring、structs那样的可植入框架。它是一套集成式快速开发框架,提供了开发完整web应用的全套解决方案,它内置: 一个基于Apache Mini的速度超快的Web Server 动态编译装载Java类,让调试Java像调试Javascript那样简单 View层<>

天才小站 497

PlayJava8Future:一个简单的实用程序类,用于 PlayFramework 和 Java 8 的 CompletableFuture 之间的互操作

一个简单的实用程序类,用于 PlayFramework 和 Java 8 的 CompletableFuture 之间的互操作。

play_framework框架--教程(一)

play_ framework框架--教程(一)

huazi99于老师的博客 2582

Play Framework Web开发教程 16 处理HTTP请求和响应

Play Framework Web开发教程 16 处理HTTP请求和响应

qq_43685118的博客 451

Web开发框架第1部分:选项和标准

在我的公司,我们正在评估未来几年将使用哪种Web开发框架。 自上次评估以来,我们一直在使用由Struts 2驱动的Java应用服务器作为MVC,将Tiles作为模板引擎,将jQuery用于Javascript awesomennes,将DWR用于AJAX调用,将MyBatis作为ORM。 但是我们认为是时候重新评估并继续使用更新/更好/更友好的框架了。 在这篇文章中,我将向您介绍我...

最佳 Java 编程 155

PLAY框架

PLAY2.0框架快速入门

cajan2的专栏 1万+

play-bootstrap深度探索:Bootstrap 3与Bootstrap 4版本差异及迁移指南

play-bootstrap是一个为Play Framework设计的Bootstrap集成库,它提供了简洁的视图模板和表单构造器,帮助开发者快速构建美观的Web界面。本文将深入分析Bootstrap 3与Bootstrap 4在play-bootstrap中的实现差异,并提供实用的迁移指南,让你轻松完成版本升级。 ## 📊 版本架构概览 play-bootstrap采用模块化设计,针对不同

gitblog_00137的博客 298

play-bootstrap核心功能解析:从输入助手到字段构造器的完整指南

play-bootstrap是Play Framework的Bootstrap库,提供了丰富的输入助手和字段构造器,帮助开发者快速构建美观且功能完善的Web表单。本文将详细介绍其核心功能,包括输入助手的使用方法、字段构造器的类型与应用,以及如何扩展自定义功能。 ## 什么是play-bootstrap? play-bootstrap是一个专为Play Framework设计的开源库,它将Boo

gitblog_01016的博客 451
上一篇: 引路蜂Android技术网站开通了
下一篇: Akka 编程(20):容错处理(一)
引路蜂
博客等级 码龄15年 3122粉丝 711原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值