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

什么';在Grails应用程序中为长时间运行的作业构建队列的最佳方法是什么?,grails,groovy,job-queue,Grails,Groovy,Job Queue,我有一个Grails应用程序,它有一些计算密集型优化,运行时间约为5分钟(也许更多)。目前,我正在主请求线程中执行这些操作,即请求返回需要5分钟。它是有效的,但从可用性的角度来看,它当然是可怕的 那么,以异步方式实现这一点的最佳方法是什么?我假设必须涉及ThreadPoolExecutor,但如何启动和访问它?我可以将其建模为Grails服务吗?或者是一份工作(似乎这些只是针对重复性的工作) 另外,处理工作状态的最佳方式是什么?通过一个标志或者数据库中的一个全新类?让浏览器显示微调器并持续轮询,

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

那么,以异步方式实现这一点的最佳方法是什么?我假设必须涉及ThreadPoolExecutor,但如何启动和访问它?我可以将其建模为Grails服务吗?或者是一份工作(似乎这些只是针对重复性的工作)

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

有一个grails插件,它可能正是您想要的

当然,您可以使用自己的线程池或使用现有的Java工具。

我会使用grails来实现这一点

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

这使得这类事情变得非常简单。

本着“可能工作的最简单的事情”的精神,我做了一些类似的事情,作为一项简单的服务。(当然可能太简单了,欢迎批评)

我使用了Groovy的特性,即线程有一个接受闭包的静态启动方法

我在一个服务上实现了一个方法,如下所示:

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

grails安装插件后台线程

def后台服务

backgroundService.execute(“做我的事”{

//你在这里工作吗


});

后台线程插件已经过时,因此我不建议使用它,而且JMS在后台处理方面似乎有些过火。JMS更像是一个消息队列,而不是后台处理实用程序


我建议您使用Quartz插件或GPAR。

有一段时间没有人问过这个问题,但由于它刚刚在搜索中出现,我想我应该补充一点,Thread对象中现在有一个Groovy threading闭包。您只需使用:

Thread.start { // async code goes here } Thread.start{ //异步代码在这里 }
一天一次。异步代码完成后可以调用更新数据方法或其他方法——如果可以运行多个线程,则可能需要同步该方法。

与简单使用ThreadPoolExecutor相比,它有什么好处?听起来要复杂得多。它肯定更复杂。主要好处是您的问题中提到的一些监控和轮询功能是围绕着一些需求展开的。在JMS世界中,这类问题已经解决了很多,但围绕它还有更多的设置/维护。这实际上取决于“enterprisey”的方式您的要求是。如果您不太关心监控,或者如果您的容器在处理过程中发生故障会发生什么,那么我会做一些更简单的事情。只有一个可能的选择。啊,我明白了。我需要的唯一监控是让用户等待特定作业完成。我也不需要事务安全,所以我会选择si更简单的方法。