在 Grails 应用程序中为长时间运行的作业构建队列的最佳方法是啥?

Posted

技术标签:

【中文标题】在 Grails 应用程序中为长时间运行的作业构建队列的最佳方法是啥?【英文标题】:What's the best way to build a queue for long-running jobs in a Grails app?在 Grails 应用程序中为长时间运行的作业构建队列的最佳方法是什么? 【发布时间】:2009-07-26 11:48:58 【问题描述】:

我有一个 Grails 应用程序,它进行了一些计算密集型优化,运行时间约为 5 分钟(可能更长)。目前,我在主请求线程中执行这些操作,即请求返回需要 5 分钟。它有效,但从可用性的角度来看当然很糟糕。

那么,以异步方式实现此功能的最佳方式是什么?我假设必须涉及一个 ThreadPoolExecutor,但是我该如何启动和访问它呢?我可以将其建模为 Grails 服务吗?还是工作(不过,这些似乎只适用于经常性工作)?

另外,处理工作状态的最佳方式是什么?通过一个标志或者数据库中的一个全新的类?浏览器是否显示微调器并一直轮询直到状态发生变化?

【问题讨论】:

【参考方案1】:

有一个 grails 插件 background-thread 可能正是您正在寻找的。​​p>

当然,也可以推出自己的线程池或使用现有的 Java 东西。

【讨论】:

【参考方案2】:

我会为此使用 grails JMS Plugin。

然后,您可以使用“onMessage”方法创建一个服务,该方法自动与底层 jms 提供程序交互(如 OpenMQ 或 ActiveMQ。

这让这种事情变得很容易。

【讨论】:

与简单地使用 ThreadPoolExecutor 相比有什么好处?听起来比这复杂得多。 肯定更复杂。主要好处在于您的问题提到的一些监控和轮询功能。在 JMS 世界中解决了很多此类问题,但围绕它进行了更多设置/维护。这实际上取决于您的要求有多“进取”。如果您不太关心监控或者如果您的容器在处理过程中出现故障会发生什么,那么我会做一些更简单的事情。只有一种可能的选择。 啊,我明白了。好吧,我需要的唯一监控是等待特定工作完成的用户。我也不需要交易安全,所以我会采用更简单的方法。【参考方案3】:

后台线程插件已经过时了,所以我不建议使用它,而且 JMS 似乎对后台处理来说太过分了。 JMS 更像是一个消息队列而不是后台处理实用程序。

我建议使用 Quartz 插件或使用 gpar。

【讨论】:

【参考方案4】:

本着“可能工作的最简单的事情”的精神,我做了这样的事情作为一项简单的服务。 (当然可能太简单了,欢迎批评)。

我使用了 Groovy 的特性,即 Thread 有一个采用闭包的静态启动方法。见http://groovy.codehaus.org/groovy-jdk/java/lang/Thread.html

我在一个服务上实现了一个方法,看起来像:

synchronized def runThreadedTask() 
  if(taskRunning)  
    // taskRunning is defined as a service level flag to monitor job status
    // if we are already running the task just return
    return;
  

  Thread.start 
    taskRunning = true
    // do job processing here
    taskRunning = false
  

【讨论】:

【参考方案5】:

grails install-plugin 后台线程

定义后台服务

backgroundService.execute("做我的事",

// 在这里工作

);

【讨论】:

【参考方案6】:

自从有人问这个问题以来已经有一段时间了,但是由于它只是在搜索中出现,我想我要补充一点,现在 Thread 对象中有一个 Groovy 线程闭包。您只需使用:

线程.start // 异步代码放在这里

收工。您的异步代码可以在完成后调用更新数据方法或其他方法 - 如果您可以运行多个线程,您可能希望同步它。

【讨论】:

以上是关于在 Grails 应用程序中为长时间运行的作业构建队列的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Colab 中为 torch_sparse 构建***需要很长时间

长时间运行任务的 Grails 状态更新

长时间运行的作业不应阻止合并 MR

如何异步运行长时间运行的操作并在 ASP.Net Ajax 中为用户显示加载并轮询结果?

使用 Spring Cloud DataFlow 在无限运行的应用程序中编排长时间运行的外部批处理作业是不是合适?

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