我有一个Grails应用程序,它具有一些计算密集型优化,运行时间约为5分钟(可能更多)。目前,我在主请求线程中执行这些操作,即请求返回需要5分钟。它有效,但从可用性的角度来看当然是可怕的。
那么以异步方式实现它的最佳方法是什么?我假设一个ThreadPoolExecutor必须参与,但我如何开始和访问它?我可以将其建模为Grails服务吗?或者一份工作(虽然这些工作只是针对经常性的工作)?
此外,处理工作状态的最佳方法是什么?通过一个标志或者DB中的全新类?让浏览器显示微调器并继续轮询,直到状态发生变化?
答案 0 :(得分:3)
有一个grails插件background-thread可能正是您正在寻找的。 p>
当然可以滚动自己的线程池或使用现有的Java东西。
答案 1 :(得分:3)
为此我会使用grails JMS Plugin。
然后,您可以使用“onMessage”方法创建一个服务,该方法可以自动与底层jms提供程序进行交互(如OpenMQ或ActiveMQ。
这使得这种事情变得非常容易。
答案 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 }
并称之为一天。您的异步代码可以在完成后调用更新数据方法或其他方法 - 如果您可以运行多个线程,则可能需要同步该方法。