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

2020年11月29日 67点热度 0条评论

我的Grails 1.3.7应用程序需要处理大XML文件,因此我有一个向其上传大文件的 Controller ,然后将服务器上此文件的路径提供给进行处理的后台线程,以便我可以立即从 Controller 操作返回。

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

  • 当应用程序崩溃或服务器关闭时,我想拦截该事件并更新我的Upload域,以说该进程已被中断
  • 我希望用户在单击链接时能够中断自己的处理,并可能从 Controller 操作
  • 中恢复它

    有没有一种方法可以持久保存对后台任务的引用,并通过java.util.concurrent框架(由Executor插件使用)拦截任何中断?

    如果我无法使用util.concurrent进行操作,是否可以使用其他插件/框架?例如,我看过Quartz,但看不到如何做。

    解决方案如下:

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

    该对象可以用来做两件事:

  • 确定进程是否已完成或被取消。
  • 取消正在运行的进程(必要时甚至中断)。
  • 从理论上讲,您应该能够在用户 session 中的某个位置保存此Future。然后,您可以稍后检索它,并使用它检查状态和/或根据需要取消该过程。

    就像是:

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

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