在Grails中保留对后台线程的引用?

时间:2011-12-29 08:32:59

标签: java grails concurrency quartz-scheduler executorservice

我的Grails 1.3.7应用程序需要处理大型XML文件,所以我有一个控制器,我上传大文件,然后我将服务器上的这个文件的路径提供给后台线程进行处理所以我可以立即从控制器动作返回。

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

  • 当应用程序崩溃或服务器关闭时,我想拦截它并更新我的上传域以说明进程被中断
  • 我希望用户能够在单击链接时自行中断处理并可能从控制器操作中恢复它

有没有办法可以持久引用我的后台任务并拦截java.util.concurrent框架(Executor插件使用的)中断?

如果我无法使用util.concurrent,那么其他插件/框架是否可行?例如,我看过石英,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

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

此对象可用于执行两项操作:

  1. 确定流程是否已完成或已取消。
  2. 取消正在运行的流程(如有必要,甚至会中断)。
  3. 理论上,您应该可以在用户的​​会话中保存此Future。然后您可以稍后检索它并使用它来检查状态和/或根据需要取消该过程。

    类似的东西:

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

    这只是想法,它没有经过测试。我也不知道是否存在导致内存泄漏的问题。完成该过程后,您需要确保已分离Future