2011-12-29 22 views
0

我的Grails 1.3.7应用程序需要处理大的XML文件,所以我有一个控制器,我上传了大文件,然后我将这个文件在服务器上的路径传递给后台线程,以便处理我可以立即返回控制器操作。在Grails中保留对后台线程的引用?

现在,我使用的是Grails Executor插件,它工作正常。我有一个上传域对象,随着处理过程的进行而更新(当前状态,已处理元素的数量等)。但现在我有2个要求:

  • 当应用程序崩溃或服务器关机,我想拦截和更新我上传域说,过程被中断
  • 我希望用户可以点击一个链接时,中断处理自己和可能来自控制器动作恢复它

有没有办法,我能坚持一提到我的后台任务,并与拦截框架的java.util.concurrent任何中断(一种方式由Executor插件使用)?

如果我不能用util.concurrent做,它可以与其他插件/框架?例如,我看了一下Quartz,但我不明白该怎么做。

回答

2

我讨厌回答没有完全测试它,但grails-executor plugin docs表示callAsync方法返回java.util.concurrent.Future object

这个对象可以用来做两件事情:

  1. 确定一个过程已完成或已取消。
  2. 取消正在运行的过程(如果需要,甚至中断)。

从理论上讲,你应该能够在用户的会话中保存这个Future。然后,您可以稍后检索并根据需要使用它来检查状态和/或取消过程。

喜欢的东西:

session.backgroundProcess = callAsync{...} 

// later 
def bgProc = session.backgroundProcess 
if(bgProc && !(bgProc.done || bgProc.cancelled)) { 
    // process is still running 
} 

这只是想法,这不是测试。我也不知道是否有问题导致内存泄漏。一旦过程完成,您需要确保您分离Future