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

时间:2009-07-26 11:48:58

标签: grails groovy job-queue

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

那么以异步方式实现它的最佳方法是什么?我假设一个ThreadPoolExecutor必须参与,但我如何开始和访问它?我可以将其建模为Grails服务吗?或者一份工作(虽然这些工作只是针对经常性的工作)?

此外,处理工作状态的最佳方法是什么?通过一个标志或者DB中的全新类?让浏览器显示微调器并继续轮询,直到状态发生变化?

6 个答案:

答案 0 :(得分:3)

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

当然可以滚动自己的线程池或使用现有的Java东西。

答案 1 :(得分:3)

为此我会使用grails JMS Plugin

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

这使得这种事情变得非常容易。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

本着“可能有效的最简单的事情”的精神,我做了一件像这样简单的服务。 (当然可能过于简单,欢迎批评)。

我使用了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
  }
}

答案 4 :(得分:1)

grails install-plugin background-thread

def backgroundService

backgroundService.execute(“做我的事”,{

//在这里工作

});

答案 5 :(得分:1)

自从被问到这一段时间已经有一段时间了,但是因为它刚刚出现在搜索中,我想我会补充说现在Thread对象中有一个Groovy线程闭包。你只需使用:

Thread.start {
    // async code goes here
}

并称之为一天。您的异步代码可以在完成后调用更新数据方法或其他方法 - 如果您可以运行多个线程,则可能需要同步该方法。