我的Grails 1.3.7应用程序需要处理大型XML文件,所以我有一个控制器,我上传大文件,然后我将服务器上的这个文件的路径提供给后台线程进行处理所以我可以立即从控制器动作返回。
目前,我正在使用Grails Executor插件,它运行正常。我有一个上传域对象,随着处理的进行而更新(当前状态,已处理元素的数量等)。但现在我还有2个要求:
有没有办法可以持久引用我的后台任务并拦截java.util.concurrent框架(Executor插件使用的)中断?
如果我无法使用util.concurrent,那么其他插件/框架是否可行?例如,我看过石英,但我不知道该怎么做。
答案 0 :(得分:2)
我讨厌在没有完全测试的情况下回答,但grails-executor plugin docs表示callAsync
方法返回java.util.concurrent.Future
object。
此对象可用于执行两项操作:
理论上,您应该可以在用户的会话中保存此Future。然后您可以稍后检索它并使用它来检查状态和/或根据需要取消该过程。
类似的东西:
session.backgroundProcess = callAsync{...}
// later
def bgProc = session.backgroundProcess
if(bgProc && !(bgProc.done || bgProc.cancelled)) {
// process is still running
}
这只是想法,它没有经过测试。我也不知道是否存在导致内存泄漏的问题。完成该过程后,您需要确保已分离Future
。