我有一个Grails 3 Web应用程序。客户端向我的应用程序发送请求后,启动一个长时间运行的进程,进程完成可能需要几秒钟或几个小时。我不想阻止客户端等待响应。因此,我为该进程启动一个新线程,但是当进程执行完成时,我无法更新客户端以了解该进程已完成。经过一些搜索,我遇到了可能是解决方案的WebSockets,或者可能存在更好的解决方案。
我想知道这个问题可能有什么好的解决方案(grails插件)。
谢谢。
答案 0 :(得分:1)
......流程完成可能需要几秒钟或几个小时。
在启动请求后数小时向浏览器发送响应容易出现一些挑战,但假设您已经完成了所有这些工作,而不是自己启动一个线程,则应该在框架中使用异步支持。 https://async.grails.org/latest/guide/index.html提供了大量信息。详细信息将具体取决于您的长时间运行过程,但您可能会对“服务器已发送事件”部分感兴趣。
我希望有所帮助。
答案 1 :(得分:0)
您可以使用构建在RxJava,GPars和Reactor之上的Async features of Grails
示例:
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"
}
}
您也可以参考Event Publishing