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

标签 java grails concurrency quartz-scheduler executorservice

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

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

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

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

如果我无法使用 util.concurrent 做到这一点,是否可以使用其他插件/框架?例如,我看过 Quartz,但我不知道如何做到这一点。

最佳答案

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

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

  1. 确定流程是否已完成或已取消。
  2. 取消正在运行的进程(甚至在必要时中断)。

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

类似于:

session.backgroundProcess = callAsync{...}

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

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

关于java - 在 Grails 中保留对后台线程的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8665531/

相关文章:

java - 意外的 VarHandle 性能(比替代方案慢 4 倍)

java - 在 JAR 中强制系统属性

security - 在 Grails 中跨多个插件共享身份验证

java - jsp 和 .equals 和 .trim() 空指针异常

grails - Grails转发参数列表

grails - Grails本地化,数字输入

performance - 在 x86_64 汇编程序 (yasm) 中使用 POSIX 线程库需要更多的执行时间

java - 如何将ThreadLocal从父线程复制到多个子线程?

java - IntelliJ IDEA 注释处理不会在配置的文件夹中生成源

java - 为什么 putObject 在使用 PutObjectRequest 时会抛出 AmazonS3Exception,但在没有 PutObjectRequest 的情况下却可以正常工作?