使用Grails3从长时间运行的进程向客户端返回响应

使用Grails3从长时间运行的进程向客户端返回响应,grails,websocket,grails-plugin,java-websocket,grails3,Grails,Websocket,Grails Plugin,Java Websocket,Grails3,我有一个Grails3Web应用程序。客户机向我的应用程序发送请求后,长时间运行的流程启动,流程完成可能需要几秒钟或几小时。我不想阻止客户端等待响应。因此,我为进程启动了一个新线程,但当进程执行完成时,我无法更新客户端以知道进程已经完成。经过一些搜索,我发现WebSockets可能是一个解决方案,或者可能存在更好的解决方案 我想知道grails插件对于这个问题可能有哪些好的解决方案 多谢各位 …完成此过程可能需要几秒钟或几小时 在请求启动数小时后向浏览器发送响应容易遇到许多挑战,但假设您已经解决

我有一个Grails3Web应用程序。客户机向我的应用程序发送请求后,长时间运行的流程启动,流程完成可能需要几秒钟或几小时。我不想阻止客户端等待响应。因此,我为进程启动了一个新线程,但当进程执行完成时,我无法更新客户端以知道进程已经完成。经过一些搜索,我发现WebSockets可能是一个解决方案,或者可能存在更好的解决方案

我想知道grails插件对于这个问题可能有哪些好的解决方案

多谢各位

…完成此过程可能需要几秒钟或几小时

在请求启动数小时后向浏览器发送响应容易遇到许多挑战,但假设您已经解决了所有这些问题,而不是自己启动线程,那么您应该在框架中使用异步支持。有很多信息可以在网站上找到。详细信息将具体取决于长时间运行的进程正在做什么,但您可能会对服务器发送事件部分感兴趣

我希望这会有所帮助。

您可以使用构建在RxJava、GPAR和Reactor之上的

例如:

import grails.async.Promise
import static grails.async.Promises.*

def longRunningTask() {
        Promise p = task {
            // Long running task
            return "Long running task completed"
        }
        p.onError { Throwable err ->
            println "An error occured ${err.message}"
        }
        p.onComplete { result ->
            //notify/update the client to know that the process has completed
            println "Promise returned: $result"
        }
    }

此外,您还可以参考

异步线程启动实际上已经完成。我只需要将流程成功完成的信息发送回客户机。由于我对grails框架非常陌生,我不知道最好使用什么。我花了几个小时来尝试您的代码,看看它能否在长时间运行任务后将响应发送回客户端,但没有机会。看来这个承诺只会起作用。我面临的挑战如下。用户跳转任务,任务作为新线程启动,因此我们将响应返回给用户,以便用户知道任务已启动。但一旦任务在后台完成,我就不能再向客户发送另一个信息来知道任务现在已经完成。在我看来,这是不可能的承诺与目前的格式。谢谢你的回复。