2009-07-26 43 views
7

我有一个Grails应用程序,它有一些计算密集型优化,运行时间约为5分钟(可能更多)。目前,我正在主请求线程中执行这些操作,即请求返回需要5分钟。它的工作原理,但从可用性的角度来看当然是可怕的。在Grails应用程序中为长时间运行的作业构建队列的最佳方式是什么?

那么以异步方式实现它的最佳方式是什么?我假设一个ThreadPoolExecutor将不得不参与,但我该如何启动并访问它?我可以将它建模为Grails服务吗?或一份工作(似乎这些只是为了重复工作,但)?

另外,处理工作状态的最佳方法是什么?通过国旗或者数据库中的全新课程?让浏览器显示一个微调器,并保持轮询,直到状态改变?

回答

3

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

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

3

为此,我会使用grails JMS Plugin

然后你就可以创建与底层的JMS提供者(如OpenMQActiveMQ自动交互的“的onMessage”方法的服务。

它使这种事情很容易。

+0

与仅使用ThreadPoolExecutor相比,有什么好处?这听起来比这更复杂。 – 2009-07-26 16:12:44

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 
    } 
} 
1

Grails的安装,插件后台线程

高清backgroundService

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

//在这里工作

});

3

后台线程插件已过时,所以我不会推荐使用它,并且JMS看起来对后台处理过分。 JMS更多的是消息队列而不是后台处理实用程序。

我会推荐使用Quartz插件或使用gpars。

1

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

 
Thread.start { 
    // async code goes here 
} 

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

相关问题