有些时候,一个Web应用有需要在正常的请求-响应周期之外执行一些代码,比如一些常时间运行的后台任务,或者也是在请求-响应周期中执行,但无需用户交互。
比如我们回到之前的产品分类的例子,我们需要跟踪订单是否有人拣选,打包了和发货了。拣选货物涉及了某个人根据订单在仓库中查找订单中的物品,然后可以打包这些货品,交给物流发货。一个实现方法是生成新图所示的货品目录的物品拣选单(和HTML表单无关)。
![20140817001](http://www.imobilebbs.com/wordpress/wp-content/uploads/2014/08/20140817001.png)
在过去很长的一段时间内,系统构架都假定这些任务都在Web应用外实现,比如在一些旧系统中的批量任务生成。 而今天的系统很多是为Web为中心的,或者是基本云服务的。使用这些架构意味着我们需要在Web应用中有能够调度和执行这些任务。
为了更好的说明问题,我们考虑这样一个系统,这个系统用来生成物品拣选单并把拣选单发给仓库管理员,我们假定我们需要使用批量处理,因为生成一个拣选任务比较费时,而且我们需要优化这些任务的顺序以使得访问不同仓库的时间最小。
异步工作的任务
一个最简单的实现方法是在Web应用的某个地方定义如下的页面:
![20140817002](http://www.imobilebbs.com/wordpress/wp-content/uploads/2014/08/20140817002.png)
用户点击”Generate & Send Pick List”按钮触发这个任务。
拣选单中的每个项目都是一个从指定仓库中提取物品的准备单,我们可以使用如下View模板来显示这个拣选单,
文件app/views/pickList.scala.html
1 | @ (warehouse : String, list : List[models.Preparation], |
4 | @ main( "Warehouse " + warehouse + " pick list for " + time){ |
9 | <th>Product description</th> |
13 | @ for ((preparation,index) <- list.zipWithIndex){ |