7

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

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

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

4

6 回答 6

3

我会为此使用 grails JMS 插件

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

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

于 2009-07-26T16:05:13.423 回答
3

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

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

于 2009-07-26T12:39:15.690 回答
3

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

我建议要么使用 Quartz 插件,要么使用 gpars。

于 2011-09-05T02:25:30.230 回答
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
  }
}
于 2009-08-03T17:31:18.023 回答
1

grails 安装插件后台线程

def 背景服务

backgroundService.execute("做我的事", {

// 在这里工作

});

于 2009-08-20T19:43:22.727 回答
1

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

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

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

于 2012-11-15T18:00:34.467 回答