长时间运行任务的 Grails 状态更新
Posted
技术标签:
【中文标题】长时间运行任务的 Grails 状态更新【英文标题】:Grails status Update for long running task 【发布时间】:2014-03-13 06:35:20 【问题描述】:我有一个长时间运行的任务(>1.5 分钟),我希望能够使用 ajax 向用户提供完成状态。 这是我目前正在做的事情: 我正在使用 ajax 处理上传(使用 ajax 上传插件),并且在任务运行时显示繁忙标签。 我希望能够显示完成百分比(不是上传百分比 - 我已经为此提供了更新。)即在我的 excel 文件完成上传并开始处理行之后,我希望能够提供状态更新给用户。
以下是我的研究/个人知识引导我的方向: 1.使用线程 2. 使用 JMS 或某种消息传递 3. 使用 grails 事件。 (不确定这将如何工作)
有谁知道最好的实现方式是什么?
【问题讨论】:
【参考方案1】:当我过去这样做时,我使用了以下方法:
-
Dispatch the long running process in another thread。长时间运行的进程会更新某些会话范围组件(或数据库中)的进度
将用户的浏览器返回到页面并启动一些javascript that regularly polls一个服务器端控制器以获取当前进度
如果您想显示完成百分比,jQuery UI progress bar 非常易于使用。
【讨论】:
你知道tomcat7中是否有Async注解吗? 是的 - @Async 注解是由 Spring 提供的,所以 Tomcat 版本并没有真正加入。 好的。谢谢。我会尽快尝试一下,然后接受答案。【参考方案2】:我们将Spring Batch 用于 Grails 应用程序中的长期运行任务(= 批处理作业)。它是 Spring 产品系列的一个框架部分,旨在构建批处理作业。
SpringSource/GoPivotal 的人确实对整体架构和提供的模式进行了很多思考。如果您的应用程序中有多个批处理作业,我会考虑查看它。
针对您的特定进度要求,Spring Batch 在运行时提供了JobOperator
或JobExplorer
等组件,可用于了解当前批处理作业状态。如果您愿意,可以使用单独的SO question about monitoring progress in Spring Batch 作为起点。
【讨论】:
以上是关于长时间运行任务的 Grails 状态更新的主要内容,如果未能解决你的问题,请参考以下文章