长时间运行任务的 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 在运行时提供了JobOperatorJobExplorer 等组件,可用于了解当前批处理作业状态。如果您愿意,可以使用单独的SO question about monitoring progress in Spring Batch 作为起点。

【讨论】:

以上是关于长时间运行任务的 Grails 状态更新的主要内容,如果未能解决你的问题,请参考以下文章

文件修改后 Grails 重启需要很长时间

在 Grails 中实现后台服务的最佳方式

在MySQL,Grails 2应用程序更长时间不活动期间保持池连接活动(或将它们计时并获得新的连接)的正确方法

Grails 如何记录安全插件活动

通信链路故障时 Grails 重新连接到 mysql

具有长时间运行任务的 Erlang gen_server