关于在Grails中进行异步处理的简单方法的建议

10 grails asynchronous servlets quartz-scheduler

假设我有一个这样的简单控制器:

class FooController {

  def index = {
     someVeryLongCompution() //e.g crawl a set of web pages
     render "Long computation was launched."
  }
}
Run Code Online (Sandbox Code Playgroud)

当调用索引操作时,我希望该方法在异步运行长计算时立即返回给用户.

我理解最有效的方法是在架构中使用消息代理,但我想知道是否有更简单的方法来实现它.

我尝试了Executor插件,但阻止了http请求返回,直到长计算完成.

我尝试过Quartz插件,但这似乎对周期性任务有好处(除非有办法只运行一次作业?)

你们是如何在Grails中处理这些请求的呢?

raf*_*ian 5

您想在同一个Grails服务器或其他服务器上处理veryLongComputation()的位置?

如果是同一台服务器,则不需要JMS,另一种选择是创建一个新线程并异步处理计算.

def index = {
     def asyncProcess = new Thread({
          someVeryLongComputation()
     } as Runnable )
     asyncProcess.start()

     render "Long computation was launched."
  }
Run Code Online (Sandbox Code Playgroud)


Kal*_*see 3

如果您在 Grails Quartz 中使用简单触发器并将重复计数设置为 0,则作业将仅运行一次。但是,它与用户请求分开运行,因此您需要找到某种方式在完成后与用户进行通信。